2009-05-23 36 views
16

Estoy trabajando en una aplicación de Android que necesita ver qué imágenes ha almacenado un usuario. El problema es que si el usuario tiene la tarjeta SD montada a través del cable USB, no puedo leer la lista de imágenes en el disco.¿Cómo saber si la tarjeta SD está montada en Android?

¿Alguien sabe de una forma de saber si el usb está montado para poder mostrar un mensaje informando al usuario que no funcionará?

+4

Sólo para que conste, conectar el cable USB no es la única manera de conseguir el volumen sdcard sin montar - desmontar la tarjeta en la configuración de almacenamiento o eliminar físicamente la tarjeta también lo hará. Además, las tarjetas SD de 8GB suministradas por t-mobile uk no están preformateadas adecuadamente, por lo que debido a las E/S se desmontaron todo el tiempo siempre que no se formatearan correctamente. Solo digo eso porque a veces solo decirle al usuario que desconecte el cable no es suficiente. –

Respuesta

37

Si usted está tratando de acceder a las imágenes en el dispositivo, el mejor método es utilizar la MediaStore content provider. Acceder a él como content provider le permitirá consultar las imágenes que están presentes, y asignar content:// URLs a rutas de archivos en el dispositivo, según corresponda.

Si aún necesita para acceder a la tarjeta SD, la aplicación de la cámara incluye una clase ImageUtils que comprueba si la tarjeta SD está montado 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; 
} 
+5

Un lo, alguien proporciona la forma de hacer api de Android. ¡Vota arriba! –

+2

¿Dónde está el método 'checkFsWritable();'? – GrIsHu

+0

¿Necesitamos '' para que funcione en el almacenamiento externo? –

1

Pido disculpas por publicar una forma que no sea de Android, espero que alguien pueda dar una respuesta usando la API de Android.

Puede enumerar los archivos en la raíz de la tarjeta sd. Si no hay ninguno, la tarjeta SD está completamente en blanco (inusual, pero es posible) o está desmontada. Si intentas crear un archivo vacío en la tarjeta SD y falla, significa que estabas tratando de crear un archivo en el punto de montaje de la tarjeta sd que sería denegado debido a un problema de permisos para que supieras que la tarjeta sd no era montado.

Sí, sé que esto es feo ....

1
public static boolean isSdPresent() { 

return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 

} 
+0

@MartinSmith la fuente allí también soy yo – Harinder

9

Aquí es la función que falta checkFsWritable en jargonjustin publicar

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(); 
    } 
0

que estaba usando el cursor para recuperar las imágenes desde la tarjeta SD y cuando se ha insertado ninguna tarjeta SD en el dispositivo el cursor fue nula. En realidad, este es el caso cuando el volumen de la tarjeta sd se desmontaba al retirar físicamente la tarjeta del dispositivo. Este es el código que he utilizado:

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

0

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; 
     } 
    } 
0
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(); 
     } 
0

Antes de hacer cualquier trabajo con el almacenamiento externo, siempre debe llamar getExternalStorageState() para comprobar si el medio está disponible. Los medios pueden estar montados en una computadora, faltantes, de solo 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

Cuestiones relacionadas