Android 2.2 – 如何检测我是否安装在SD卡上?

我正在写一个存储大量媒体文件的android应用程序。 它们不是用户通知或其他媒体目录的types(并且太多),但它们也必须是用户可更新的,所以我不能将它们放在资源中。 我可以使用getExternalFilesDir来获取SD卡上的path,但是我只想要这样做,如果应用程序本身安装在SD卡上。 如果应用程序在内部安装,我想将媒体放入内存。

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

Solutions Collecting From Web of "Android 2.2 – 如何检测我是否安装在SD卡上?"

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

不过,根据您的情况(不pipe您是否拥有所有的“媒体”,或者用户在使用应用程序时获取/创build它),您可能需要将其放在外部存储上。 一个大尺寸的内部应用程序是由许多用户皱起了眉头(和许多内部媒体可能会使它巨大)。

这是我的代码来检查如果应用程序安装在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; } 

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