【问题标题】:Android 2.2 - How do I detect if I am installed on the SDCard or not?Android 2.2 - 如何检测我是否安装在 SDCard 上?
【发布时间】:2010-10-23 15:16:00
【问题描述】:

我正在编写一个存储大量媒体文件的 android 应用程序。它们不是那种会弄乱用户通知或其他媒体目录的类型(而且太多了),但它们也必须是用户可更新的,所以我不能把它们放在资源中。我可以使用 getExternalFilesDir 来获取 sdcard 上的路径,但我只想在应用程序本身安装在 sdcard 上时这样做。如果应用是内部安装的,我想把媒体放在内存中。

那么如何确定我的应用是在内部存储器还是外部存储器中运行?

【问题讨论】:

    标签: android android-emulator android-2.2-froyo android-sdcard


    【解决方案1】:

    您可以使用 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
        }
    }
    

    不过,根据您的情况(无论您是否预先拥有所有“媒体”,或者用户在使用应用程序时获取/创建它),您可能都希望将其放在外部存储上。许多用户不赞成大型内部应用程序(并且许多内部媒体可能会使它变得庞大)。

    【讨论】:

      【解决方案2】:

      这是我检查应用程序是否安装在 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;
        }
      

      【讨论】:

      • 1.检查/mnt/sdcard 似乎很老套——为什么不使用Environment 类中的目录呢? 2.我自己没试过,文件目录不是一直在内部存储吗?第二次检查有什么意义?无论如何,Pre-Froyo 无法安装到 SD 卡。或者您是否添加了它来处理像 CyanogenMod 这样具有自己的 app2sd 实现的 ROM 的情况?
      • 1.你是对的,使用 Environment.EXTERNAL_STORAGE_DIRECTORY 更好。 2.如果应用程序安装在SD上,我认为不会。是的,第二次检查是针对修改后的 ROMS。
      【解决方案3】:

      要检查应用程序是否安装在 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)
      
      }
      

      【讨论】:

      • 可以作为系统应用安装。在这种情况下,您需要检查.startsWith("/system/")
      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2010-11-05
      • 1970-01-01
      相关资源
      最近更新 更多