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); } 
  • Android intención para sdcard listo
  • Cómo guardar el archivo desde el sitio web a sdcard
  • Android External App Install (en la tarjeta SD), vuelva a cargar las alarmas del alarmmanager al re-montar a través del receptor
  • Abra una aplicación de cámara por intención y guardar la imagen en el SD y imageView
  • Android: ubicación absoluta de la tarjeta SD externa
  • Cómo crear un archivo de imagen de tarjeta SD para el emulador de Android?
  • Cómo obtener Galley Thumbnail para la carpeta de imágenes en particular en android?
  • Cómo abrir un archivo PDF local en PhoneGap (android)
  • File.canWrite () dice "true" pero no puedo escribir en almacenamiento extraíble (kit kat)
  • Conseguir todo el espacio total y disponible en Android
  • ¿Existe un límite para el número de archivos en un directorio de una tarjeta SD?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.