我正在寫一個存儲大量媒體文件的android應用程序。它們不是用戶通知或其他媒體目錄的類型(並且太多),但它們也必須是用戶可更新的,所以我不能將它們放在資源中。我可以使用getExternalFilesDir獲取SD卡上的路徑,但我只想在應用程序本身安裝在SD卡上的時候這樣做。如果應用程序內部安裝,我想將媒體放入內部存儲器。Android 2.2 - 如何檢測我是否安裝在SD卡上?
那麼如何確定我的應用程序是在內部存儲器還是外部存儲器中運行?
我正在寫一個存儲大量媒體文件的android應用程序。它們不是用戶通知或其他媒體目錄的類型(並且太多),但它們也必須是用戶可更新的,所以我不能將它們放在資源中。我可以使用getExternalFilesDir獲取SD卡上的路徑,但我只想在應用程序本身安裝在SD卡上的時候這樣做。如果應用程序內部安裝,我想將媒體放入內部存儲器。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
}
}
不過,根據您的情況(你是否擁有所有的「媒體」的前面,或者用戶獲取/創建它,因爲它們使用該應用程序),您可能希望將其放在外部存儲上。一個大尺寸的內部應用程序被許多用戶所詬病(許多內部媒體可能會使它變得龐大)。
這裏是我的,如果安裝在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)
}
它可以作爲系統應用程序安裝。在這種情況下,你需要檢查'.startsWith(「/ system /」)'。 – Enyby 2016-03-12 20:31:19
1.檢查'/mnt'和'/ sdcard'似乎很詭異 - 爲什麼不使用'Environment'類中的目錄? 2.我自己沒有嘗試過,是不是文件目錄總是在內部存儲?第二次檢查有什麼意義?無論如何,Pre-Froyo無法安裝到SD卡。或者你是否增加了處理像CyanogenMod這樣的自己的app2sd實現的ROM的情況? – EboMike 2012-01-06 07:08:34
1.你說得對,使用Environment.EXTERNAL_STORAGE_DIRECTORY更好。 2.如果應用程序安裝在SD上,我認爲不會。是的,第二個檢查是修改ROMS。 – peceps 2012-01-09 10:09:44