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).
- Android: Guardar el archivo permanentemente (incluso después de borrar datos / desinstalar)
- Error al empujar el elemento (s). En android
- Obtener stringXmlContent y escribir a continuación, guardado en el archivo .xml almacenado en sdcard en android ¿cómo se puede?
- Instalación de la aplicación Android sin tarjeta SD
- Android abrir o crear base de datos
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; } }
- Android - Aplicación (apk) Tamaño máximo
- ACTION_GET_CONTENT: ¿Cómo obtener el fin del archivo al buscar varios tipos de archivo?
- Almacenamiento extraíble (externo) vía sdcard por los fabricantes
- ¿Cómo encontrar el almacenamiento interno (Almacenamiento predeterminado del teléfono) y el almacenamiento externo (tarjeta SD extraíble) en android?
- Acceso al almacenamiento en el rincón
- Android: Guardar archivos en la tarjeta SD
- ¿Cómo comprobar el permiso se concede para una ruta de directorio y no abre el error EACCES?
- Creación de un archivo zip con algunos archivos en SDCard
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); }
- ¿Cómo habilitar Scale en Android ScrollView de una manera que no impide que se desplace y haga clic en sus elementos secundarios?
- Uso del código de versión de AndroidManifest.xml en hormiga