Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo saber si la sdcard está montada en Android?

Estoy trabajando en una aplicación de Android que necesita mirar qué imágenes un usuario ha almacenado. El problema es que si el usuario tiene la sdcard montada a través del cable USB, no puedo leer la lista de imágenes en el disco.

¿Alguien sabe de una manera de saber si el usb está montado para que yo sólo podría aparecer un mensaje informando al usuario que no va a funcionar?

8 Solutions collect form web for “¿Cómo saber si la sdcard está montada en Android?”

Si está intentando acceder a imágenes en el dispositivo, el mejor método es utilizar el proveedor de contenido de MediaStore . Si accede a él como proveedor de contenido, podrá consultar las imágenes que están presentes y asignar el content:// URLs a los caminos de archivos en el dispositivo cuando corresponda.

Si todavía necesita acceder a la tarjeta SD, la aplicación Cámara incluye una clase ImageUtils que comprueba si la tarjeta SD se monta de la siguiente manera:

 static public boolean hasStorage(boolean requireWriteAccess) { //TODO: After fix the bug, add "if (VERBOSE)" before logging errors. String state = Environment.getExternalStorageState(); Log.v(TAG, "storage state is " + state); if (Environment.MEDIA_MOUNTED.equals(state)) { if (requireWriteAccess) { boolean writable = checkFsWritable(); Log.v(TAG, "storage writable is " + writable); return writable; } else { return true; } } else if (!requireWriteAccess && Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } return false; } 

Aquí está la función missing de jargonjustin en el post jargonjustin

 private static boolean checkFsWritable() { // Create a temporary file to see whether a volume is really writeable. // It's important not to put it in the root directory which may have a // limit on the number of files. String directoryName = Environment.getExternalStorageDirectory().toString() + "/DCIM"; File directory = new File(directoryName); if (!directory.isDirectory()) { if (!directory.mkdirs()) { return false; } } return directory.canWrite(); } 

Me disculpo por publicar una forma no-Android de hacer esto, espero que alguien pueda proporcionar una respuesta usando la API de Android.

Usted podría enumerar los archivos en la raíz del sdcard. Si no hay ninguno, la tarjeta SD está completamente en blanco (inusual, pero posible) o está desmontada. Si intenta crear un archivo vacío en la tarjeta SD y falla, significa que estaba intentando crear un archivo en el punto de montaje de la tarjeta SD que se denegaría debido a un problema de permisos para que supiera que la tarjeta SD no era montado.

Sí, sé que esto es feo …

 public static boolean isSdPresent() { return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); } 

Yo estaba usando el cursor para recuperar las imágenes de la tarjeta sd y cuando no se insertó ninguna tarjeta sd en el dispositivo el cursor era nulo. En realidad, este es el caso cuando el volumen de la tarjeta SD se desmonta retirando físicamente la tarjeta del dispositivo. Este es el código que he usado:

  Cursor mCursor = this.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null); if (mCursor == null || !mCursor .moveToFirst()) { /** *mCursor == null: * - query failed; the app don't have access to sdCard; example: no sdCard * *!mCursor.moveToFirst(): * - there is no media on the device */ } else { // process the images... mCursor.close(); } 

Más información: http://developer.android.com/guide/topics/media/mediaplayer.html#viacontentresolver

 Cool....Check it out... try { File mountFile = new File("/proc/mounts"); usbFoundCount=0; sdcardFoundCount=0; if(mountFile.exists()) { Scanner usbscanner = new Scanner(mountFile); while (usbscanner.hasNext()) { String line = usbscanner.nextLine(); if (line.startsWith("/dev/fuse /storage/usbcard1")) { usbFoundCount=1; Log.i("-----USB--------","USB Connected and properly mounted---/dev/fuse /storage/usbcard1" ); } } } if(mountFile.exists()){ Scanner sdcardscanner = new Scanner(mountFile); while (sdcardscanner.hasNext()) { String line = sdcardscanner.nextLine(); if (line.startsWith("/dev/fuse /storage/sdcard1")) { sdcardFoundCount=1; Log.i("-----USB--------","USB Connected and properly mounted---/dev/fuse /storage/sdcard1" ); } } } if(usbFoundCount==1) { Toast.makeText(context,"USB Connected and properly mounted", 7000).show(); Log.i("-----USB--------","USB Connected and properly mounted" ); } else { Toast.makeText(context,"USB not found!!!!", 7000).show(); Log.i("-----USB--------","USB not found!!!!" ); } if(sdcardFoundCount==1) { Toast.makeText(context,"SDCard Connected and properly mounted", 7000).show(); Log.i("-----SDCard--------","SDCard Connected and properly mounted" ); } else { Toast.makeText(context,"SDCard not found!!!!", 7000).show(); Log.i("-----SDCard--------","SDCard not found!!!!" ); } }catch (Exception e) { e.printStackTrace(); } 

Antes de hacer cualquier trabajo con el almacenamiento externo, siempre debe llamar a getExternalStorageState () para comprobar si el medio está disponible. Los medios pueden estar montados en una computadora, faltantes, de sólo lectura o en algún otro estado. Por ejemplo, aquí hay un par de métodos que puede utilizar para comprobar la disponibilidad:

 /* Checks if external storage is available for read and write */ public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } /* Checks if external storage is available to at least read */ public boolean isExternalStorageReadable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } return false; } 

Fuente: http://developer.android.com/guide/topics/data/data-storage.html

En el post de jargonjustin:

Archivo ImageManager.java

Método hasStorage ->

 public static boolean hasStorage(boolean requireWriteAccess) { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { if (requireWriteAccess) { boolean writable = checkFsWritable(); return writable; } else { return true; } } else if (!requireWriteAccess && Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } return false; } 

Método checkFsWritable ->

  private static boolean checkFsWritable() { // Create a temporary file to see whether a volume is really writeable. // It's important not to put it in the root directory which may have a // limit on the number of files. String directoryName = Environment.getExternalStorageDirectory().toString() + "/DCIM"; File directory = new File(directoryName); if (!directory.isDirectory()) { if (!directory.mkdirs()) { return false; } } File f = new File(directoryName, ".probe"); try { // Remove stale file if any if (f.exists()) { f.delete(); } if (!f.createNewFile()) { return false; } f.delete(); return true; } catch (IOException ex) { return false; } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.