使用華為、Vivo等手機(jī)的人或者Android開發(fā)者應(yīng)該對讀取應(yīng)用列表權(quán)限不陌生,但是作為開發(fā)者的你有沒有想過這個權(quán)限需要申請嗎?是靜態(tài)申請還是動態(tài)申請?
0、答案
這里我先公布下答案:不需要
1、起因
我要實現(xiàn)讀取已安裝應(yīng)用列表功能,Google了一下,可以通過PackageManager.getInstalledPackages()方法獲取,我手頭有三臺手機(jī),分別是華為Nexus 5X、Meta9、Vivo X20,寫了個Demo在這三個手機(jī)上進(jìn)行測試,測試結(jié)果如下:
- Nexus 5X:獲取到全部已安裝應(yīng)用列表。
- Meta 9:獲取到全部已安裝應(yīng)用列表。
- Vivo X20:這里出現(xiàn)了一個很奇怪的現(xiàn)象,有時能全部已安裝應(yīng)用列表,有時獲取不到,有兩種情況:
- 打開Demo時,彈出申請讀取已安裝應(yīng)用列表權(quán)限對話框,允許之后,只能獲取到系統(tǒng)應(yīng)用和微信、支付寶等個別應(yīng)用。
- 打開Demo時,不彈出申請讀取已安裝應(yīng)用列表權(quán)限對話框,能夠獲取到全部已安裝應(yīng)用列表。
我沒有申請任何權(quán)限,Vivo X20為什么會出現(xiàn)申請讀取已安裝應(yīng)用列表權(quán)限對話框呢?為什么是有時候能獲取到全部已安裝應(yīng)用列表,有時候獲取不到?
2、驗證過程
Google一下,看有沒有和我類似的問題,找到了一篇:
Android 如何完整的獲取到用戶已安裝應(yīng)用列表
這篇文章中,作者有個結(jié)論:『國內(nèi)部分廠商比如華為、oppo,他們將”獲取用戶已安裝應(yīng)用列表”的權(quán)限暴露給了用戶,讓用戶可以自由決定允許或者禁止應(yīng)用訪問該信息?!?/p>
Nexus 5X中沒有找到讀取已安裝應(yīng)用列表權(quán)限。
這里有提到華為,我打開meta 9的權(quán)限列表看了一下有讀取已安裝應(yīng)用列表權(quán)限,我的Demo對應(yīng)的這個權(quán)限默認(rèn)是打開的,所以meta 9是能獲取到全部已安裝應(yīng)用列表。

再看下Vivo X20,在打開Demo的時候彈出申請權(quán)限對話框了,說明Vivo也屬于那部分國內(nèi)廠商,由于在彈出申請讀取已安裝應(yīng)用列表權(quán)限對話框時,我允許了,所以打開Vivo X20的讀取已安裝應(yīng)用列表權(quán)限時,這里的狀態(tài)是打開的,但是,點進(jìn)去一看,暗藏玄機(jī),這里還有一個安全等級,分為高、中、低,我的Demo屬于高,看看其他應(yīng)用呢?微信安全等級屬于低、支付寶屬于低,讀取不到應(yīng)用列表難道和這個安全等級有關(guān)系嗎?
我手動將我的Demo的安全等級調(diào)整為低,再打開Demo,奇跡發(fā)生了,沒有彈出申請讀取已安裝應(yīng)用列表權(quán)限對話框,并且獲取到了全部已安裝應(yīng)用列表。
3、結(jié)論
Android 讀取已安裝應(yīng)用列表不需要申請權(quán)限,因為Android權(quán)限列表中沒有權(quán)限是用于讀取已安裝應(yīng)用列表的。
如果想要獲取Vivo X20這種有安全等級的手機(jī)中的已安裝應(yīng)用列表,由于這種安全等級我們無法決定,所以只能通過反向查找的方式,即通過包名能否找到應(yīng)用,從而判斷是否安裝了某應(yīng)用。
//通過包名找應(yīng)用
private boolean hasPackage(Context context, String pkgName) {
if (null == context || null == pkgName) {
return false;
}
boolean bHas = true;
try {
context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_GIDS);
} catch (NameNotFoundException e) {
// 拋出找不到的異常,說明該程序已經(jīng)被卸載
bHas = false;
}
return bHas;
}
這種方法獲取不到全部已安裝應(yīng)用列表,只能獲取到指定的應(yīng)用。
如果有比較了解權(quán)限的同學(xué)覺得我有寫的不對的地方,或者對于獲取已安裝應(yīng)用列表有更好的方法,歡迎留言交流!