当前位置: 首页 > 科技观察

Android11中的包可见性

时间:2023-03-15 00:50:53 科技观察

在Android10及更早版本中,应用程序可以通过queryIntentActivities()等方法获取设备上所有已安装应用程序的列表。在大多数情况下,此访问权限远远超出了应用程序的实际需要。随着我们继续关注隐私,我们在Android11中引入了一些新变化,这些变化将改变应用查询用户已安装应用并与之交互的方式。为此,我们对安装在特定设备上的应用程序列表进行了更好的访问控制。为了更好地“负责”访问已安装应用程序的行为,默认情况下,针对Android11(目标API级别30)的应用程序将默认只能检测部分过滤的已安装应用程序。如果你想获取更多关于其他已安装应用列表的信息,你需要在应用中的Android清单中添加该元素以扩大访问范围。在大多数常见场景中,包括以startActivity()开头的任何意图,您无需进行任何更改。其他场景,比如直接从你的应用界面打开特定的第三方应用,开发者需要显式声明应用的包名或者intentfilter签名,如下:...最常见的场景https://developer。android.google.cn/preview/privacy/package-visibility#use-cases-not-affected其他场景https://developer.android.google.cn/preview/privacy/package-visibility-use-casesintentfiltersignaturehttps://developer.android.google.cn/preview/privacy/package-visibility#intent-signature如果你使用CustomTab打开URL链接,你可以调用resolveActivity()和queryIntentActivities()来启动一个非浏览器应用程序(如果您已经安装了处理URL的应用程序)。在Android11中,有更好的方法来处理这个问题:使用Intent的FLAG_ACTIVITY_REQUIRE_NON_BROWSER标志,而不是查询其他应用。如果浏览器在您使用此标记调用startActivity()时启动,则会抛出ActivityNotFoundException,此时您的应用程序可以处理异常并使用自定义选项卡打开URL链接。try{valintent=Intent(ACTION_VIEW,Uri.parse(url)).apply{//非浏览器应用会直接处理URL(默认)//用户也可以在消歧对话框中选择非浏览器应用addCategory(CATEGORY_BROWSABLE)flags=FLAG_ACTIVITY_NEW_TASKorFLAG_ACTIVITY_REQUIRE_NON_BROWSER}startActivity(intent)}catch(e:ActivityNotFoundException){//只使用浏览器应用,或者默认使用浏览器处理intent。}自定义标签https://developers.google.cn/web/android/custom-tabs更好的方式https://developer.android.google.cn/preview/privacy/package-visibility-use-cases#avoid-a-disambiguation-dialogFLAG_ACTIVITY_REQUIRE_NON_BROWSERhttps://developer.android.google.cn/preview/privacy/package-visibility#web-intent-non-browser-app在极少数情况下,您的应用程序可能需要查询所有已安装的应用程序或与它们,无论这些应用程序包含哪些组件。为了允许您的应用查看所有其他已安装的应用,Android11引入了QUERY_ALL_PACKAGES权限。在即将发布的政策更新中,GooglePlay将为需要QUERY_ALL_PACKAGES权限的应用提供指导。您可以通过将API级别设置为30并使用AndroidStudio3.2+和最近发布的相应AndroidGradle插件来将元素添加到您的应用程序中。您可以在开发者文档-Android11中的包可见性中找到包可用性的更多使用信息和用例。QUERY_ALL_PACKAGEShttps://developer.android.google.cn/preview/privacy/package-visibility#all-apps开发者文档-包可见性在Android11https://developer.android.google.cn/preview/privacy/package-visibilityAndroidStudio和Gradle支持此功能。如果使用AndroidGradleplugin4.1及以上版本,可以正常使用新element,因为旧版本的Gradleplugin不兼容这个element。如果您使用或依赖支持Android11的库或SDK,可能会导致清单冲突和合并清单错误。例如,在构建您的应用程序时,您可能会在构建输出窗口中看到以下错误:Androidresourcelinkingfailed/Users/sample/AndroidStudioProjects/MyApp/app/build/intermediates/merged_manifests/debug/AndroidManifest.xml:18:error:unexpectedelementfoundinBuildOutputWindow中可能会出现一条错误消息,指示您查看清单合并日志(Manifestmergerlogs):Manifestmergerfailedwithmultipleerrors,seelogs展开MergedManifest视图后,会额外出现一条错误消息:Error:Missing'package'keyattributeoneelementpackageMergedManifestviewhttps://developer.android.google.cn/studio/build/manifest-merge#inspect_the_merged_manifest_and_find_conflicts修复AndroidGradle插件解决以上错误最好的方法是将AndroidGradle插件升级到4.1Beta版本.但是,并非所有开发者都能使用最新版本,部分项目可能依赖旧版本的Gradle或代码库,与4.1版本的AndroidGradle插件存在兼容性问题。因此,我们近期发布了AndroidGradle插件兼容元素的小版本(dotreleases)升级:AndroidGradle插件升级到4.1Beta版https://developer.android.google.cn/studio/releases/gradle-plugin#updating-pluginminorversion(dotreleases)升级https://developer.android.google.cn/studio/releases/gradle-plugin#4-0-0例如,如果你使用的是4.0。0版本的AndroidGradle插件,可以在项目级的build.gradle文件中将相关依赖升级到上图中对应的版本。buildscript{repositories{google()jcenter()}dependencies{//classpath'com.android.tools.build:gradle:4.0.0'classpath'com.android.tools.build:gradle:4.0.1'}}