看看Google怎么說:
Note: don't be confused by the word "external" here. This directory can better be thought as media/shared storage. It is a filesystem that can hold a relatively large amount of data and that is shared across all applications (does not enforce permissions). Traditionally this is an SD card, but it may also be implemented as built-in storage in a device that is distinct from the protected internal storage and can be mounted as a filesystem on a computer.
翻譯:
如果說pc上也要區(qū)分出外部存儲和內(nèi)部存儲的話膏蚓,那么自帶的硬盤算是內(nèi)部存儲,U盤或者移動硬盤算是外部存儲孙咪,
因此我們很容易帶著這樣的理解去看待安卓手機樊破,認為機身固有存儲是內(nèi)部存儲,而擴展的TF卡是外部存儲魂莫。
比如我們?nèi)蝿?wù)16GB版本的Nexus 4有16G的內(nèi)部存儲还蹲,普通消費者可以這樣理解,但是安卓的編程中不能耙考,這16GB仍然是外部存儲谜喊。
所有的安卓設(shè)備都有外部存儲和內(nèi)部存儲,這兩個名稱來源于安卓的早期設(shè)備琳骡,
那個時候的設(shè)備內(nèi)部存儲確實是固定的锅论,而外部存儲確實是可以像U盤一樣移動的。
但是在后來的設(shè)備中楣号,很多中高端機器都將自己的機身存儲擴展到了8G以上,
他們將存儲在概念上分成了"內(nèi)部internal" 和"外部external" 兩部分怒坯,但其實都在手機內(nèi)部炫狱。
所以不管安卓手機是否有可移動的sdcard,他們總是有外部存儲和內(nèi)部存儲剔猿。
最關(guān)鍵的是视译,我們都是通過相同的api來訪問可移動的sdcard或者手機自帶的存儲(外部存儲)。
Android只在編程概念上 分為外部存儲和內(nèi)部存儲归敬,和手機有沒有插TF卡沒有關(guān)系
內(nèi)部儲存
在文件系統(tǒng)中的 /data/data/你的包名/
使用內(nèi)部儲存酷含,主要調(diào)用Context類的方法,例如 Context.getFileDir()
外部儲存
可以是內(nèi)置sd卡或者可移動sd卡汪茧,也可以兩者都有
使用外部儲存椅亚,主要調(diào)用 Environment類的方法,例如 Environment.getExternalStorageDirectory()
內(nèi)置sd卡和可移動sd卡均可通過Environment.getExternalStorageDirectory().path獲取到路徑
但這會分兩種情況
1.沒有內(nèi)置sd卡(一般只存在早期的Android機子)
可以獲取到可移動sd卡的路徑
2.有內(nèi)置sd卡
可以獲取到內(nèi)置sd卡的路徑舱污,不能獲取到可移動sd卡的路徑
若存在內(nèi)置sd卡時呀舔,仍然想獲取可移動sd卡的路徑,參考以下代碼
private static String getExtendedMemoryPath(Context mContext) {
StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
Class<?> storageVolumeClazz = null;
try {
storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
Method getPath = storageVolumeClazz.getMethod("getPath");
Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
Object result = getVolumeList.invoke(mStorageManager);
final int length = Array.getLength(result);
for (int i = 0; i < length; i++) {
Object storageVolumeElement = Array.get(result, i);
String path = (String) getPath.invoke(storageVolumeElement);
boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
if (removable) {
return path;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
參考:
http://www.reibang.com/p/2de0113b3164
end
如果你覺得這篇文章對你有所幫助扩灯,不妨點一個贊媚赖,作者會非常高興的霜瘪。