Android: espera que el almacenamiento externo esté listo
Actualmente estoy desarrollando un fondo de pantalla en vivo que lee desde almacenamiento externo. Cuando el dispositivo está arrancando, supongo que es posible que el fondo de pantalla en vivo para ser lanzado antes de que el almacenamiento está listo. Especialmente si está haciendo la comprobación periódica de errores. Otros reportan problemas y creo que esta es la razón. No puedo probar esto, porque el almacenamiento externo parece montar al instante en mi dispositivo, y no estoy seguro de cómo obligar a hacer la comprobación de errores. Así que mi primera pregunta es, ¿el sistema en realidad la forma de la intención BOOT_COMPLETED antes de que se inicia el fondo de pantalla en vivo.
Si no es así, cuál es la forma correcta de esperar a que el almacenamiento externo esté listo. Estoy pensando en llamar algo como esto al principio de la aplicación
- La aplicación Android de Alibaba causa bloqueo cuando intenta abrir una URL
- ¿Por qué getExternalFilesDirs () no funciona en algunos dispositivos?
- External AndroidManifest.xml no aparece en el panel de vista del proyecto
- Compartir y persistir datos entre varias aplicaciones de Android
- Lectura y escritura de un archivo desde la tarjeta SD
public void waitForExternalStorage() { while(Environment.getExternalStorageState().equals(Environment.MEDIA_CHECKING)) { try { Thread.sleep(1000L); } catch(InterruptedException e) { e.printStackTrace(); } } }
¿Tengo que comprobar si hay otros casos, en caso de que MEDIA_REMOVED -> MEDIA_UNMOUNTED -> MEDIA_CHECKING (opcional) -> MEDIA_READY en el arranque?
- Archivo de ahorro de Android en un almacenamiento externo
- Android no puede encontrar la clase de la jarra externa
- Leer archivo de almacenamiento externo
- ¿Cómo comprobar la disponibilidad de espacio en el almacenamiento externo?
- Android java.io.File.fixSlashes (File.java:185)
- ¿Dispositivos USB externos a teléfonos Android?
- Almacenamiento de datos en el almacenamiento externo
- Abrir vínculos externos en el navegador con la vista web de Android
Puede registrar un BroadcastReceiver
para escuchar los cambios en el estado de almacenamiento externo:
BroadcastReceiver externalStorageStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { updateExternalStorageState(); } }; IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_MOUNTED); filter.addAction(Intent.ACTION_MEDIA_REMOVED); registerReceiver(mExternalStorageReceiver, filter); updateExternalStorageState(); // You can initialize the state here, before any change happens
Y en updateExternalStorageState()
puede comprobar el estado real después del cambio:
protected void updateExternalStorageState() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { // SD card is mounted and ready for use } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { // SD card is mounted, but it is read only } else { // SD card is unavailable } }
Utilice el receptor de emisión, escuche Intent.ACTION_MEDIA_MOUNTED
: Acción de difusión: El soporte externo está presente y montado en su punto de montaje.
Necesitaba exactamente eso. Estoy leyendo un archivo de configuración de la tarjeta SD y mi aplicación en marcha simplemente no se puede ejecutar sin leerlo. Una solución simple es esperar un máximo de 15-30 segundos para que la tarjeta SD sea montada automáticamente por el sistema operativo Android. Si no es así, lance una excepción. Aquí está el código. Simplemente aumente el límite de conteo máximo para aumentar el tiempo de espera. ExternalStorageNotReadyException es una excepción personalizada.
public void awaitExternalStorageInitialization() throws ExternalStorageNotReadyException { boolean mExternalStorageAvailable = false; boolean mExternalStorageWriteable = false; int count = 0; do { String state = Environment.getExternalStorageState(); if(count > 0) { try { Thread.sleep(3000); } catch (InterruptedException e) { Log.e(Constants.LOG_TAG, e.getMessage(), e); } } if (Environment.MEDIA_MOUNTED.equals(state)) { // We can read and write the media mExternalStorageAvailable = mExternalStorageWriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { // We can only read the media mExternalStorageAvailable = true; mExternalStorageWriteable = false; } else { // Something else is wrong. It may be one of many other states, // but all we need // to know is we can neither read nor write mExternalStorageAvailable = mExternalStorageWriteable = false; } count++; } while ((!mExternalStorageAvailable) && (!mExternalStorageWriteable) && (count < 5)); if(!mExternalStorageWriteable) throw new ExternalStorageNotReadyException("External storage device (SD Card) not yet ready"); }