Android11的包可見性
我們的應(yīng)用常常會碰到與其他應(yīng)用交互,比如登錄功能剥槐,我們可能希望使用微信登錄或者QQ登錄损谦,再比如分享,我們先判斷是否安裝了微信找颓,然后決定是否展示微信的分享圖標(biāo)等等合愈。這里我們有一個需求就是獲取相關(guān)的軟件包是否已經(jīng)安裝。
但是在Android11中击狮,除了默認的一些應(yīng)用外佛析,我們不能直接獲取到軟件包是否已經(jīng)安裝了,換句話說我們安裝了一個應(yīng)用彪蓬,但是我們調(diào)用 getInstalledApplications()
或 getInstalledPackages()
的可能沒有返回此包名寸莫。這就是Android11引入的包可見性的概念。
操蛋档冬,為啥Android11中引入包可見性呢膘茎?
這里Goole給了兩個原因:
鼓勵最小權(quán)限原則,需要與那些應(yīng)用交互酷誓,就申請那些包名披坏。
幫助 Google Play 等應(yīng)用商店評估應(yīng)用的隱私性和安全性。
那我們在Android11該怎么獲取某個包是否安裝了呢呛牲?
在創(chuàng)建應(yīng)用程序時刮萌,需要我們考慮我們的應(yīng)用打算與設(shè)備上那些已安裝應(yīng)用交互,然后在manifest中娘扩,通過使用<queries>節(jié)點來聲明我們會與之交互的包名着茸。
Android如何讓包可見
我們這里講一下具體的如何讓包可見
安裝 Android Studio 4.1.2 或更高版本。
升級Android的Gradle到3.6.1或更高版本 我這里用的是4.1.2
dependencies {
classpath "com.android.tools.build:gradle:4.1.2"
}
確保應(yīng)用的
targetSdkVersion
設(shè)為30
在
manefist
中琐旁,使用<queries>聲明我們的應(yīng)用期望與那些應(yīng)用交互涮阔。
<queries>
<package android:name="com.facebook.katana" />
<package android:name="com.tencent.mm" />
</queries>
- 調(diào)用
getInstalledApplications()
或getInstalledPackages()
,就可以看到與之交互的應(yīng)用包名了灰殴。
例子請查看:https://github.com/wfeii/Android11
其他問題
問題1: PackageManager.queryIntentActivities()接口在Android11是否可用敬特?
Android11中,可以使用此接口。為了功能正常伟阔,我們還是需要在manefist中聲明<queries>辣之。格式如下:
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
</queries>
我項目中的例子:
<queries>
<!-- 拍照意圖:MediaStore.ACTION_IMAGE_CAPTURE -->
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
<!-- 拍攝意圖:MediaStore.ACTION_VIDEO_CAPTURE -->
<intent>
<action android:name="android.media.action.VIDEO_CAPTURE" />
</intent>
<!-- 圖片裁剪意圖 -->
<intent>
<action android:name="com.android.camera.action.CROP" />
</intent>
<!-- 打電話意圖:Intent.ACTION_DIAL -->
<intent>
<action android:name="android.intent.action.DIAL" />
</intent>
<!-- 分享意圖:Intent.ACTION_SEND -->
<intent>
<action android:name="android.intent.action.SEND" />
</intent>
<!-- 調(diào)起其他頁面意圖:Intent.ACTION_VIEW -->
<intent>
<action android:name="android.intent.action.VIEW" />
</intent>
</queries>
問題2: 獲取設(shè)備中的所有的應(yīng)用怎么辦?比如我的應(yīng)用是殺毒軟件皱炉,需要掃描所有軟件怀估。
系統(tǒng)提供了查詢所有的應(yīng)用的權(quán)限,只需做如下聲明:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
參考資料
https://developer.android.com/about/versions/11/privacy/package-visibility
https://developer.android.com/training/basics/intents/package-visibility