Android 2.2 - Как определить, установлен ли я на SDCard или нет? - PullRequest
9 голосов
/ 23 октября 2010

Я пишу приложение для Android, в котором хранится много медиа-файлов. Они не являются типом (и их слишком много), чтобы загромождать уведомления пользователей или другие мультимедийные каталоги, но они также должны обновляться пользователем, поэтому я не могу поместить их в ресурсы. Я могу использовать getExternalFilesDir, чтобы получить путь на SD-карте, но я хочу сделать это, только если само приложение установлено на SD-карте. Если приложение установлено внутри, я хочу поместить носитель во внутреннюю память.

Так как я могу определить, работает ли мое приложение во внутренней или внешней памяти?

Ответы [ 3 ]

9 голосов
/ 23 октября 2010

Вы можете использовать PackageManager, чтобы получить ApplicationInfo, и оттуда проверить «флаги» для FLAG_EXTERNAL_STORAGE .

Вот небольшой пример, который я сделал для демонстрации:

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

Тем не менее, в зависимости от вашей ситуации (независимо от того, есть ли у вас все «носители» заранее или пользователь получает / создает их, когда они используют приложение), вы можете захотеть поместить их на внешнее хранилище независимо от того. Многие пользователи недовольны большим внутренним приложением (и большое количество внутренних носителей сделало бы его огромным).

3 голосов
/ 21 июня 2011

Вот мой код для проверки, установлено ли приложение на 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 голосов
/ 29 марта 2013

Чтобы проверить, установлено приложение на SD-карте или нет, просто сделайте это:

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)

}
...