Как я могу узнать, установлено ли мое приложение на SD-карте

#android

#Android

Вопрос:

Я хотел бы что-то сделать, что-то вроде:

 val cacheDir = if (installedOnSD)
   {
   getContext.getExternalCacheDir
   }
else
   {
   getContext.getCacheDir
   }
  

и я немного в недоумении из-за части installedOnSD. Кто-нибудь может указать мне правильное направление?

PS: Пример псевдокода в Scala, просто ради удовольствия.

Ответ №1:

Вот мой код для проверки, установлено ли приложение на 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 = App.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 amp; 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;
  }
  

Комментарии:

1. Интересно. Я так понимаю, что уровень API 7 предназначен для рутированных телефонов. И импорт отсутствует.

Ответ №2:

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

 ApplicationInfo io = context.getApplicationInfo();

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

//application is installed in internal memory
return false;

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

//application is installed in sdcard(external memory)
return true;
}