Caché de imágenes en la aplicación de ejemplo BitmapFun – ¿Cuál es la justificación detrás de este cheque?

Quiero implementar memoria y caché de disco para las imágenes. Investigar He encontrado este enlace y código de ejemplo (puede descargarlo desde el enlace de la derecha)

Http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

En algún lugar del código hay este método:

/** * Get a usable cache directory (external if available, internal otherwise). * * @param context The context to use * @param uniqueName A unique directory name to append to the cache dir * @return The cache dir */ public static File getDiskCacheDir(Context context, String uniqueName) { // Check if media is mounted or storage is built-in, if so, try and use external cache dir // otherwise use internal cache dir final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !isExternalStorageRemovable() ? getExternalCacheDir(context).getPath() : context.getCacheDir().getPath(); return new File(cachePath + File.separator + uniqueName); } 

Me pregunto cuál es la razón detrás de este cheque:

 Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !isExternalStorageRemovable() 

La segunda parte me parece redundante. Esto se puede leer como "incluso si el almacenamiento externo no está montado vamos a usarlo porque no se puede quitar", pero obviamente no se puede utilizar para el almacenamiento en caché, ya que no está montado.

Lo gracioso está sucediendo en el emulador con este código. Se bloquea en AVD basado en Galaxy Nexus y tarjeta SD no especificada. La primera parte devolverá false (lo verá como "removed") y la segunda devolverá true (porque el almacenamiento "externo" no es removible en GN). Por lo tanto, tratará de utilizar el almacenamiento externo y se bloqueará, ya que no se puede utilizar.

He probado con mi Nexus Galaxy para ver cuál es el valor de la primera parte cuando el teléfono está conectado a la PC pa o Mac y es cierto en ambas ocasiones. Todavía está montado, pero la PC o Mac puede escribir a él no menos.

En caso de necesitarlos aquí hay otros métodos utilizados en el código anterior:

 /** * Check if external storage is built-in or removable. * * @return True if external storage is removable (like an SD card), false * otherwise. */ @TargetApi(9) public static boolean isExternalStorageRemovable() { if (Utils.hasGingerbread()) { return Environment.isExternalStorageRemovable(); } return true; } /** * Get the external app cache directory. * * @param context The context to use * @return The external cache dir */ @TargetApi(8) public static File getExternalCacheDir(Context context) { if (Utils.hasFroyo()) { return context.getExternalCacheDir(); } // Before Froyo we need to construct the external cache dir ourselves final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/"; return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir); } 

Pregunta de la prima: ¿Está alguien usando este código en la producción? ¿Es esta una buena idea?

Publicar mi propio comentario como respuesta. Puede ser útil para otra persona. :

GetExternalStorageDirectory no devuelve siempre la tarjeta SD. Por eso se implementó el control de seguridad.

Respuesta similar que había publicado aquí y es una buena práctica para comprobar siempre para ello.

Espero que esto le dará alguna pista sobre la doble verificación.

  • Depurar javascript en android emulador con phonegap
  • La aplicación se ha detenido de forma inesperada: ¿Cómo depurar?
  • No se pudo ejecutar el emulador de Android como no pudo inicializar emulados framebufferHAX en Windows 7
  • Emulador de Android con configuración de proxy - Error FATAL: .// android / base / sockets / Cheque falló: isValidFd (fd). Fd 1404 max1024
  • Pasar lista de objetos de una actividad a otra actividad en android
  • Eclipse Debugging Android no funciona
  • OutOfMemory en el dispositivo y el emulador
  • ¿Qué imágenes del sistema debo instalar para Android L Developement?
  • Cómo guardar una imagen png en android
  • Emulador de Android en Yakkety Yak (Ubuntu 16.10)
  • Hacer que el emulador de android por defecto sea más rápido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.