我有一台中興的android手機,型號是 zte u930hd,手機沒有插入外接sd卡(也就是micro sd card,原名trans-flash card(tf卡),2023年正式更名為micro sd card),但是機身自帶了乙個內建儲存卡(也就是emmc儲存,大小為2g)。
我把這個手機用資料線插到電腦上,也會看到碟符,通過安裝「r.e 管理器」等檔案管理應用,也可以管理檔案,並且能看到該儲存的掛載目錄是:/mnt/sdcard2
但是,我列印 environment.getexternalstoragestate(),卻返回 」removed「;
這是怎麼回事?明明手機本身帶著內建sd卡,卻為何提示這麼乙個資訊?
我又試著去列印了environment.getexternalstoragedirectory(),返回:「/mnt/sdcard」
看起來可以解釋了,在我這個中興手機上,呼叫environment.getexternalstoragedirectory(),返回的儲存目錄並不是系統內建的sd卡目錄。
我又換了乙個 sony l39u,乙個 moto g,呼叫environment.getexternalstoragedirectory()返回的目錄就是系統內建的sd卡目錄。
不同的裝置上,呼叫getexternalstoragedirectory()返回值卻不一樣。查詢了android的文件,才找到原因,原來這個方法返回的是當前裝置廠商所認為的「外部儲存」,有可能返回外接的sd卡目錄(micro sd card),也可能返回內建的儲存目(emmc)。
總結一下:
一部分手機將emmc儲存掛載到 /mnt/external_sd 、/mnt/sdcard2 等節點,而將外接的sd卡掛載到 environment.getexternalstoragedirectory()這個結點。
此時,呼叫environment.getexternalstoragedirectory(),則返回外接的sd的路徑。
而另一部分手機直接將emmc儲存掛載在environment.getexternalstoragedirectory()這個節點,而將真正的外接sd卡掛載到/mnt/external_sd、/mnt/sdcard2 等節點。
此時,呼叫environment.getexternalstoragedirectory(),則返回內建的sd的路徑。
至此就能解釋為都是無外接sd卡的情況下,在中興手機上,呼叫
列印 environment.getexternalstoragestate(),卻返回 」removed「,在索尼、moto g上就返回:「mounted」
原因已經知道了,可是如何在無外接sd卡的時候,獲取到這個內建emmc儲存的具體路徑呢?
比如,我這個中興手機,既然使用 environment.getexternalstoragedirectory() 獲取到的是外接sd卡路徑,但是我又沒有插入sd卡,這個時候我想使用內建的emmc儲存來儲存一些程式中用到的資料,我怎麼去獲取這個emmc儲存的路徑呢?
答案是:通過掃瞄系統檔案」system/etc/vold.fstab」來實現。
「system/etc/vold.fstab」 只是乙個簡單的配置檔案,它描述了android的掛載點資訊。
我們可以遍歷這個檔案來獲取所有的掛載點:
/**
* 遍歷 "system/etc/vold.fstab」 檔案,獲取全部的android的掛載點資訊
* *@return
*/private
static arraylistgetdevmountlist() }}
return out;
}
之後,當 environment.getexternalstoragestate()返回「removed」的時候(即,當沒有掛載外接sd卡的時候),通過getdevmountlist()方法獲取乙個list,這個list中可以進行寫操作的那個就是系統自帶的emmc儲存目錄了。
判斷邏輯:
/**
* 獲取擴充套件sd卡儲存目錄
* * 如果有外接的sd卡,並且已掛載,則返回這個外接sd卡目錄
* 否則:返回內建sd卡目錄
* *@return
*/public
static string getexternalsdcardpath()
string path = null;
file sdcardfile = null;
arraylistdevmountlist = getdevmountlist();
for (string devmount : devmountlist) else }}
if (path != null)
return
null;
}
參考:
[1][2]
[3]
Android 小公尺手機Toast自帶應用名問題
2018 01 05的一天在小公尺測試機上看到toast提示多了應用名,一想是不是 出問題了,一路debug,沒毛病啊。是不是原始碼更新了toast,官方文件api查起,沒有換啊。不行,得瞅瞅原始碼,gogogo,可是原始碼也沒有加上應用名字的 啊,不對,還有乙個就是我build.gradle裡的各...
Android 內部儲存與外部儲存
android.permission.write external storage 注意 目前所有應用都可以讀取外部儲存,而無需特別的許可權。但這在將來版本中會進行更改。如果應用需要讀取外部儲存 但不向其寫入資訊 那麼您將需要宣告 read external storage許可權。android.p...
Android資料儲存 使用內部儲存
可以直接在裝置的內部儲存中儲存檔案。預設情況下,儲存到內部儲存的檔案是應用的私有檔案,其他應用 和使用者 不能訪問這些檔案。當使用者解除安裝您的應用時,這些檔案也會被移除。要建立私有檔案並寫入到內部儲存 1.使用檔名稱和操作模式呼叫 openfileoutput 這將返回乙個 fileoutputs...