前言
在Android 11上有很多的更新都是用來保護隱私的,之前使用的來獲取安裝的應用列表的方法耐版,在targetSdkVersion 30及以上則會失效祠够,系統(tǒng)會自動過濾這些信息,經測試只能獲得自己當前使用的應用包名及系統(tǒng)的一些應用包名(系統(tǒng)會自動讓部分應用可見粪牲,以便我們的應用可與其交互)古瓤,想要了解具體的信息,可以到下方的地址去查看:
As of Android 11, this method no longer returns information about all apps; see https://g.co/dev/packagevisibility
先看看如何獲取安裝的應用列表
List<ApplicationInfo> infos = getPackageManager().getInstalledApplications(0);
for (ApplicationInfo info : infos) {
Log.e("yzt", info.packageName);
}
再看看Android 11.0及以上如何適配腺阳,其實有3種方法可以查詢別的應用包名
如果已經知道想交互的應用包名落君,可以這么做:
在Android的AndroidManifest.xml的<manifest>之下加入<queries>標簽,并且在其中使用<package>來聲明想要交互的應用包名舌狗,比如這里寫的是微信和QQ的包名叽奥,也就是遍歷時能找到微信和QQ
<queries>
<package android:name="com.tencent.mm" />
<package android:name="com.tencent.mobileqq" />
</queries>
如果已經知道能相應特定Intent的應用,可以這么做:
同樣的痛侍,在Android的AndroidManifest.xml的<manifest>之下加入<queries>標簽朝氓,并且在其中使用<package>來聲明有對應Intent功能的應用魔市,比如在這里寫的是具有圖片分享功能的Intent,遍歷時找到了飛豬等包名赵哲。需要注意的是<intent>中只能有一個<action>元素待德,并且<data>中也只能有mimeType,scheme和host這些屬性枫夺。
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/png" />
</intent>
</queries>
看到有作者提到直接使用android.intent.action.MAIN這個action就可以獲取安裝的應用列表将宪,經測試確實可以,真是機智橡庞,幾乎所有的應用都有這個action吧较坛。
<queries>
<intent>
<action android:name="android.intent.action.MAIN" />
</intent>
</queries>
最后是希望查詢所有應用,那就需要申請權限了:
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
結尾
當然也可以選擇維持在targetSdkVersion在30以下扒最,這樣就暫時不用適配丑勤,具體還是看項目的要求。