8

J'écris une application Android qui stocke beaucoup de fichiers multimédias. Ils ne sont pas le type (et sont beaucoup trop) pour encombrer la notification des utilisateurs ou d'autres répertoires de médias, mais ils doivent également être modifiables par l'utilisateur, donc je ne peux pas les mettre dans les ressources. Je peux utiliser getExternalFilesDir pour obtenir un chemin sur la carte SD, mais je veux seulement le faire si l'application elle-même est installée sur la carte SD. Si l'application est installée en interne, je veux mettre le média dans la mémoire interne. Comment puis-je déterminer si mon application fonctionne en mémoire interne ou externe?Android 2.2 - Comment détecter si je suis installé sur la carte SD ou non?

Répondre

9

Vous pouvez utiliser PackageManager pour obtenir le ApplicationInfo, et à partir de là, vérifiez les "drapeaux" pour FLAG_EXTERNAL_STORAGE.

Voici un exemple rapide, je fait pour démontrer:

@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 
    } 
} 

encore, en fonction de votre situation (si vous avez tous les « médias » à l'avant ou l'utilisateur est/crée comme ils utilisent l'application), vous voudrez peut-être le mettre sur le stockage externe indépendamment. Une application interne de grande taille est désapprouvée par de nombreux utilisateurs (et beaucoup de médias internes la rendraient probablement énorme).

3

Voici mon code pour vérifier si l'application est installée sur la carte 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. Checking '/mnt' et '/ sdcard' semble hacky - pourquoi n'utilisez-vous pas les répertoires de la classe' Environment'? 2. Je ne l'ai pas essayé moi-même, le répertoire des fichiers n'est-il pas toujours en mémoire interne? Quel est le but de la deuxième vérification? Pre-Froyo ne peut pas installer sur la carte SD de toute façon. Ou avez-vous ajouté cela pour gérer le cas des ROMs comme CyanogenMod qui avaient leur propre implémentation app2sd? – EboMike

+0

1. Vous avez raison, en utilisant Environment.EXTERNAL_STORAGE_DIRECTORY est mieux. 2. Je ne pense pas si l'application est installée sur SD. Et oui, la deuxième vérification est pour ROMS modifiés. – peceps

0

Pour vérifier l'application est installée dans la carte SD ou non, il suffit de faire ceci:

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

Il peut être installé en tant qu'application système. Vous devez vérifier '.startsWith ("/system/")' dans ce cas. – Enyby

Questions connexes