samsung - ¿Cómo saber si la sdcard está montada en Android?
sd card as internal storage (8)
Antes de realizar cualquier trabajo con el almacenamiento externo, siempre debe llamar a getExternalStorageState () para verificar si los medios están disponibles. 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 usar para verificar 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
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.
¿Alguien sabe de una manera de saber si el usb está montado para que pueda abrir un mensaje informando al usuario que no funcionará?
Aquí está la función que falta jargonjustin
en jargonjustin
post
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();
}
En la publicación 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;
}
}
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 estaba nulo. En realidad, este es el caso cuando el volumen de la tarjeta SD se desmontó al retirar 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
Pido disculpas por publicar una forma no Android de hacer esto, con suerte alguien puede proporcionar una respuesta utilizando la API de Android.
Puede listar los archivos en la raíz de la sdcard. Si no hay ninguno, la sdcard está completamente en blanco (inusual, pero es posible) o está desmontada. Si intenta crear un archivo vacío en la sdcard y falla, significa que estaba intentando crear un archivo en el punto de montaje de la sdcard que se denegaría debido a un problema de permisos, por lo que sabría que la sdcard no estaba montado.
Sí, sé que esto es feo ...
Si está intentando acceder a las imágenes en el dispositivo, el mejor método es utilizar el proveedor de contenido MediaStore . Accediendo a él como proveedor de contenido le permitirá consultar las imágenes que están presentes y asignar el content://
URLs a filepaths en el dispositivo, según corresponda.
Si aún necesita acceder a la tarjeta SD, la aplicación de la cámara incluye una clase ImageUtils que verifica si la tarjeta SD está montada 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;
}
public static boolean isSdPresent() {
return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
}
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();
}