8

我正在寫一個存儲大量媒體文件的android應用程序。它們不是用戶通知或其他媒體目錄的類型(並且太多),但它們也必須是用戶可更新的,所以我不能將它們放在資源中。我可以使用getExternalFilesDir獲取SD卡上的路徑,但我只想在應用程序本身安裝在SD卡上的時候這樣做。如果應用程序內部安裝,我想將媒體放入內部存儲器。Android 2.2 - 如何檢測我是否安裝在SD卡上?

那麼如何確定我的應用程序是在內部存儲器還是外部存儲器中運行?

回答

9

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

這裏是我的,如果安裝在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.檢查'/mnt'和'/ sdcard'似乎很詭異 - 爲什麼不使用'Environment'類中的目錄? 2.我自己沒有嘗試過,是不是文件目錄總是在內部存儲?第二次檢查有什麼意義?無論如何,Pre-Froyo無法安裝到SD卡。或者你是否增加了處理像CyanogenMod這樣的自己的app2sd實現的ROM的情況? – EboMike 2012-01-06 07:08:34

+0

1.你說得對,使用Environment.EXTERNAL_STORAGE_DIRECTORY更好。 2.如果應用程序安裝在SD上,我認爲不會。是的,第二個檢查是修改ROM​​S。 – peceps 2012-01-09 10:09:44

0

來檢查應用程序安裝在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) 

} 
+0

它可以作爲系統應用程序安裝。在這種情況下,你需要檢查'.startsWith(「/ system /」)'。 – Enyby 2016-03-12 20:31:19