android - reconoce - reparar tarjeta sd dañada desde el movil
Compruebe si la tarjeta SD está presente, boolean siempre es verdadero (7)
¿No debería ser?
boolean isPresent = Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED
);
Como indica la documentación para Environment.getExternalStorageState()
:
Obtiene el estado actual del dispositivo de almacenamiento primario "externo" .
Y para el Environment.MEDIA_MOUNTED-constant :
getExternalStorageState()
devuelveMEDIA_MOUNTED
si el medio está presente y montado en su punto de montaje con acceso de lectura / escritura .
Y esto funcionará desde el nivel API 1+
En mi pantalla de bienvenida, quiero verificar si el teléfono tiene una tarjeta SD. La declaración booleana está debajo:
Boolean isSDPresent = android.os.Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED );
Por lo tanto, si tengo la tarjeta SD en la ranura de mi teléfono, este booleano devolverá verdadero, hasta ahora todo va bien. Cuando voy a "Desmontar la tarjeta SD" en el menú de configuración, y quito la tarjeta SD, luego mato la aplicación y la vuelvo a iniciar, el booleano también será verdadero.
Y si ejecuto el Astro File Manager
después de desmontar y quitar la sdcard, todavía puedo acceder a la ruta /mnt/sdcard
, ¿por qué?
¿Cómo puedo lograr esto?
¡Gracias por adelantado!
EDITAR
Probando con el siguiente código:
File path = Environment.getExternalStorageDirectory();
String pathS = path.getPath();
Cuando la tarjeta SD está en la ranura, la pathS
contiene mnt/sdcard
, pero cuando quito la pathS
SD la pathS
sigue siendo /mnt/sdcard
...
// Prueba esto si prefieres guardar externo ...
public String preferextstorage(Context con){
int version = Build.VERSION.SDK_INT;
String result=con.getFilesDir().getPath();
if (version>=19) {
File[] listOfInternalAndExternalStorage = con.getExternalFilesDirs(null);
if (listOfInternalAndExternalStorage.length >= 2) {
// it contains sd card
if (listOfInternalAndExternalStorage[1]==null){
result=listOfInternalAndExternalStorage[0].getPath();
}else
{
result=listOfInternalAndExternalStorage[1].getPath();
}
return result;
}
}
return result;
}
Descubrí que los teléfonos, como los teléfonos Galaxy de Samsung, tienen /mnt/sdcard
apuntando a la memoria interna y no a la tarjeta SD externa como se esperaba.
Puede saber si la ruta devuelta por Environment.getExternalStorageDirectory() es en realidad la tarjeta SD externa con una llamada a Environment.isExternalStorageRemovable()
Solo quería agregar de la documentación para getExternalStorageDirectory () esta nota importante:
Nota: no se confunda con la palabra "externa" aquí. Este directorio puede pensarse mejor como medio / almacenamiento compartido. Es un sistema de archivos que puede contener una cantidad relativamente grande de datos y que se comparte en todas las aplicaciones (no impone permisos). Tradicionalmente, esta es una tarjeta SD, pero también puede implementarse como almacenamiento incorporado en un dispositivo que es distinto del almacenamiento interno protegido y puede montarse como un sistema de archivos en una computadora.
Este fragmento de código podría ser útil para que detecte y maneje la excepción de los dispositivos Samsung:
public static String getExternalStorage() {
String str = Environment.getExternalStorageDirectory().getAbsolutePath();
if ( isSamsungDevice() ) {
if ( isSamsungExternalSDMounted() ) {
str += "/external_sd";
}
}
return str;
}
private static boolean isSamsungDevice() {
return new File( Environment.getExternalStorageDirectory().getAbsolutePath() + "/external_sd" ).exists();
}
private static boolean isSamsungExternalSDMounted() {
return exec( "mount" ).indexOf( "external_sd" ) >= 0;
}
public static String exec( String paramString ) {
try {
String str = "";
InputStream localInputStream = Runtime.getRuntime().exec( paramString ).getInputStream();
byte[] arrayOfByte = new byte[1024];
StringBuilder localStringBuilder = new StringBuilder();
while ( true ) {
int i = localInputStream.read( arrayOfByte, 0, arrayOfByte.length );
if ( i == -1 ) {
str = localStringBuilder.toString();
break;
}
localStringBuilder.append( new String( arrayOfByte, 0, i ) );
}
return str;
} catch ( IOException e ) {
e.printStackTrace();
return null;
}
}
Modifiqué que si existe una tarjeta SD, establece la ruta allí si no la establece en el directorio interno
Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
if(isSDPresent)
{
path = theAct.getExternalCacheDir().getAbsolutePath() + "/GrammarFolder";
}
else
{
path = theAct.getFilesDir() + "/GrammarFolder";
}
Si desea mostrar si la tarjeta SD está insertada o no, simplemente copie y pegue este código para que funcione al 100% para todos los dispositivos, el código está aquí:
File file = new File("/mnt/extSdCard");
try
{
File list[] = file.listFiles();
Toast.makeText(getApplicationContext(), "Yes sdcard is mounted, file count "+list.length, Toast.LENGTH_LONG).show();
}
catch(NullPointerException o)
{
Toast.makeText(getApplicationContext(), "Sorry no sdcard is mounted:", Toast.LENGTH_LONG).show();
}
Tenemos dos estados de memoria. Una es la tarjeta de memoria interna y la otra es la tarjeta sd externa. Depende de los fabricantes del dispositivo cómo hayan fabricado la ruta de la tarjeta de memoria. Por lo tanto, si está verificando la disponibilidad de la tarjeta SD, es posible que se vuelva real en ambos casos debido a la memoria interna. Así que ve por este método:
File[] listOfInternalAndExternalStorage=context.getExternalFilesDirs(null);
if(listOfInternalAndExternalStorage.length>=2){
// it contains sd card
}
el código anterior verificará si listOfInternalAndExternalStorage es más de uno, entonces tiene almacenamiento externo, de lo contrario no contiene tarjeta SD.