¿Por qué Environment.getExternalStoragePublicDirectory no funciona en algunos dispositivos (fabricados especialmente desde principios de 2011)?

Estoy tratando de almacenar las imágenes capturadas de la cámara al directorio de almacenamiento público, aquí está mi parte del código para almacenar la imagen:

protected File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); return image; } 

Su funcionamiento muy bien en la mayoría de los dispositivos, pero en algunos dispositivos i obtener

Java.io.IOException: open failed: ENOENT (Ningún archivo o directorio)

Así que mi pregunta es ¿por qué la misma pieza de código está funcionando bien en la mayoría de los dispositivos y por qué no en algunos dispositivos y cómo solucionar este problema?

Si estás almacenando tus imágenes en un directorio público, supongo que es porque quieres compartirlas con otras aplicaciones. Tienes que hacerte la siguiente pregunta: "¿Quiero que los archivos generados por mi aplicación para sobrevivir mi aplicación se desinstale?" Si la respuesta es no (que recomiendo) debe utilizar Context.getExternalMediaDirs() lugar. Además de la API 19 y superiores, estos directorios no necesitan permisos de almacenamiento.

Si la respuesta es (O_o), debe utilizar Environment.getExternalStorageDirectory() o Enrivonment.getExternalStoragePublicDirectory(String) . Estos siempre requieren permisos de almacenamiento. Además, como usted ya experimentó y otros señalaron, estos directorios podrían no existir todavía. Compruebe la documentación de la API para obtener más información, pero en resumen, debe llamar a paths.mkdirs() antes para asegurarse de que existan los dirs.

En su lugar, use context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) .

puedes usar

File storageDir = new File("/mnt/extSdCard/Pictures")

o

File storageDir =new File("/mnt/external_sd/Pictures")

Por supuesto es mejor comprobar el directorio primero usando este código:

 if(storageDir.isDirectory()) 
  • Cómo guardar imágenes de la cámara en Android a la carpeta específica?
  • Leer archivo en android - permiso de archivo denegado
  • ¿Cómo puedo permitir que un usuario explore / elija un archivo para el uso de mi aplicación en Android?
  • Carpeta añadida en android no visible a través de USB
  • Android Studio - Explorador de archivos de Android Device Monitor no funciona
  • Android - Obtiene el tipo MIME desde un archivo sin extensión
  • ¿Cómo puedo copiar archivos al sistema de archivos de android?
  • Cómo reactivar una advertencia de Android Lint deshabilitada en el nivel de archivo
  • Escribir byte en Archivo en Java
  • Obtener acceso al dispositivo de almacenamiento masivo USB en android
  • ACRA: ¿Cómo puedo escribir ACRA informe a archivo (en tarjeta SD)?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.