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

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?

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"); } 
  • Guardar datos entre actividades utilizando clases externas
  • Android - Agregar biblioteca externa al proyecto
  • Interno u externo uri en la obtención de datos de mediastore
  • Notificación de eliminación de SDcard, cómo se hace? ¿Difusión o servicio?
  • Android Proguard saltar el frasco externo
  • IllegalStateException al grabar un video en una tarjeta SD externa con el nuevo Storage Access Framework (SAF)
  • Cómo copiar el archivo usando adb a android directorio accesible desde PC
  • Android: class NOT FOUND en Eclipse-built jar externo, pero se encuentra en Netbeans construido uno
  • Cómo guardar el archivo de texto analizado en almacenamiento interno / externo en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.