8

Estoy escribiendo una aplicación para Android que almacena una gran cantidad de archivos multimedia. No son del tipo (y son demasiados) para desordenar las notificaciones de los usuarios u otros directorios de medios, pero también deben ser actualizables por el usuario, por lo que no puedo ponerlos en los recursos. Puedo usar getExternalFilesDir para obtener una ruta en la tarjeta SD, pero solo quiero hacer eso si la aplicación está instalada en la tarjeta sd. Si la aplicación está instalada internamente, quiero poner los medios en la memoria interna.Android 2.2 - ¿Cómo puedo detectar si estoy instalado en la tarjeta SD o no?

Entonces, ¿cómo puedo determinar si mi aplicación se está ejecutando en la memoria interna o externa?

Respuesta

9

usted podría utilizar para obtener el PackageManager ApplicationInfo, y desde allí comprobar las "banderas" para FLAG_EXTERNAL_STORAGE.

Aquí está un ejemplo rápido que hice para demostrar:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    PackageManager pm = getPackageManager(); 
    try { 
     PackageInfo pi = pm.getPackageInfo("com.totsp.helloworld", 0); 
     ApplicationInfo ai = pi.applicationInfo; 
     // this only works on API level 8 and higher (check that first) 
     Toast 
       .makeText(
         this, 
         "Value of FLAG_EXTERNAL_STORAGE:" 
            + ((ai.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == ApplicationInfo.FLAG_EXTERNAL_STORAGE), 
         Toast.LENGTH_LONG).show(); 
    } catch (NameNotFoundException e) { 
     // do something 
    } 
} 

Sin embargo, dependiendo de su situación (si está o no tiene todos los "medios" por adelantado, o que el Usuario/lo crea, ya que utilizan la aplicación), es posible que desee colocarlo en el almacenamiento externo independientemente. Una aplicación interna de gran tamaño es mal vista por muchos usuarios (y muchos medios internos probablemente la hagan enorme).

3

Aquí está mi código para comprobar si la aplicación está instalada en la tarjeta SD:

/** 
    * Checks if the application is installed on the SD card. 
    * 
    * @return <code>true</code> if the application is installed on the sd card 
    */ 
    public static boolean isInstalledOnSdCard() { 

    Context context = MbridgeApp.getContext(); 
    // check for API level 8 and higher 
    if (VERSION.SDK_INT > android.os.Build.VERSION_CODES.ECLAIR_MR1) { 
     PackageManager pm = context.getPackageManager(); 
     try { 
     PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); 
     ApplicationInfo ai = pi.applicationInfo; 
     return (ai.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == ApplicationInfo.FLAG_EXTERNAL_STORAGE; 
     } catch (NameNotFoundException e) { 
     // ignore 
     } 
    } 

    // check for API level 7 - check files dir 
    try { 
     String filesDir = context.getFilesDir().getAbsolutePath(); 
     if (filesDir.startsWith("/data/")) { 
     return false; 
     } else if (filesDir.contains("/mnt/") || filesDir.contains("/sdcard/")) { 
     return true; 
     } 
    } catch (Throwable e) { 
     // ignore 
    } 

    return false; 
    } 
+0

1. Comprobación '/mnt' y '/ sdcard' parecen hacky - ¿por qué no usas los directorios de la clase' Environment'? 2. No lo he probado, ¿el directorio de archivos no está siempre en el almacenamiento interno? ¿Cuál es el punto del segundo cheque? Pre-Froyo no puede instalarse en la tarjeta SD de todos modos. ¿O lo agregaste para manejar el caso de las ROM como CyanogenMod que tenían su propia implementación de app2sd? – EboMike

+0

1. Tiene razón, usando Environment.EXTERNAL_STORAGE_DIRECTORY es mejor. 2. Creo que no si la aplicación está instalada en SD. Y sí, el segundo cheque es para ROMS modificados. – peceps

0

Para verificar la aplicación se instala en la tarjeta SD o no, simplemente hacer esto:

ApplicationInfo io = context.getApplicationInfo(); 

if(io.sourceDir.startsWith("/data/")) { 

//application is installed in internal memory 

} else if(io.sourceDir.startsWith("/mnt/") || io.sourceDir.startsWith("/sdcard/")) { 

//application is installed in sdcard(external memory) 

} 
+0

Se puede instalar como aplicación del sistema. Necesita verificar '.startsWith ("/system/")' en este caso. – Enyby

Cuestiones relacionadas