evitando un bloqueo cuando alguien monta una tarjeta SD de Android

Tengo un archivo abierto en la tarjeta SD. Cuando alguien monta la tarjeta SD, se acaba de estrellar mi aplicación. Estoy intentando registrarme para el evento de difusión ACTION_MEDIA_EJECT, y lo recibo, pero parece que lo estoy haciendo demasiado tarde. Para cuando consigo eso, ya se ha estrellado mi aplicación. ¿Hay alguna forma de recibir notificaciones antes de bloquear mi aplicación?

Se agregó un código de ejemplo muy simple. Cuando hago esto, se acaba por estrellarse el servicio cuando se enciende USB (modo MSC).

Test.java

/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { startService(new Intent(this, TestService.class)); bindService(new Intent(this, TestService.class), serviceConnection, Context.BIND_AUTO_CREATE); } catch (Exception e) { } } protected TestService testService; private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { TestService.LocalBinder binder = (TestService.LocalBinder) service; testService = binder.getService(); } @Override public void onServiceDisconnected(ComponentName name) { testService = null; } }; 

TestService.java

 @Override public void onCreate() { super.onCreate(); try { mFileOutputStream = new FileOutputStream("/sdcard/test2", true); } catch (Exception e) { } } @Override public IBinder onBind(Intent intent) { return binder; } public static class LocalBinder extends Binder { public static TestService getService() { return _this; } } 

Está matando a su aplicación porque es una decisión de diseño documentada en android para matar cualquier proceso que sostiene una manija abierta a la tarjeta sd cuando la tarjeta SD necesita ser desmontada del dispositivo (por ejemplo para ser USB montado en una PC conectada).

Un sistema de archivos que todavía tiene identificadores de archivos abiertos no se puede desmontar correctamente. En el nivel del sistema operativo, no hay manera de revocar un identificador de archivo, a falta de matar el proceso al que se concedió, por lo que es lo que acaba de hacer Android.

 if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { //access external file } 

Sin saber más acerca de qué excepciones se están lanzando, esto es todo lo que puedo recomendar.

Además, el siguiente código de la documentación de clase de entorno puede ayudar:

 BroadcastReceiver mExternalStorageReceiver; boolean mExternalStorageAvailable = false; boolean mExternalStorageWriteable = false; void updateExternalStorageState() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { mExternalStorageAvailable = mExternalStorageWriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { mExternalStorageAvailable = true; mExternalStorageWriteable = false; } else { mExternalStorageAvailable = mExternalStorageWriteable = false; } handleExternalStorageState(mExternalStorageAvailable, mExternalStorageWriteable); } void startWatchingExternalStorage() { mExternalStorageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.i("test", "Storage: " + intent.getData()); updateExternalStorageState(); } }; IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_MOUNTED); filter.addAction(Intent.ACTION_MEDIA_REMOVED); registerReceiver(mExternalStorageReceiver, filter); updateExternalStorageState(); } void stopWatchingExternalStorage() { unregisterReceiver(mExternalStorageReceiver); } 
  • ¿Establecer ubicación de instalación para Android 1.6?
  • Conseguir todo el espacio total y disponible en Android
  • Cómo abrir un archivo PDF local en PhoneGap (android)
  • Android: Error al entregar el resultado ResultInfo {who = null, request = 1, result = -1, data = Intent
  • Android External App Install (en la tarjeta SD), vuelva a cargar las alarmas del alarmmanager al re-montar a través del receptor
  • Cómo obtener Galley Thumbnail para la carpeta de imágenes en particular en android?
  • Lectura y escritura de archivos XML
  • Android Cómo ver doc de sdcard en gallary?
  • Android: cómo escuchar "tarjeta sd eliminada inesperadamente"
  • Android: carga la fuente personalizada en la tarjeta SD
  • No se puede crear una carpeta en sdcard - mkdir siempre devuelve false
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.