重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要讲解了“Android 11中的软件包可见性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android 11中的软件包可见性是什么”吧!
创新互联建站是一家集网站建设,江都企业网站建设,江都品牌网站建设,网站定制,江都网站建设报价,网络营销,网络优化,江都网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
为了更好地 "问责" 访问已安装应用的行为,默认情况下,以 Android 11 为目标平台 (目标 API level 为 30) 的应用默认将只能检测到部分过滤后的已安装应用。如果想获取更多别的已安装应用列表信息,则需要在应用内的 Android manifest 中添加 元素,从而拓宽访问范围。
在大部分常见场景下,包括任何以 startActivity() 启动的 intents,您不需要做任何改动。而其他场景,比如从您应用的界面中直接打开某个特定的第三方应用,则需要开发者们显式地声明应用的包名或者 intent filter 签名,如下所示:
...
大部分常见场景
https://developer.android.google.cn/preview/privacy/package-visibility#use-cases-not-affected
其他场景
https://developer.android.google.cn/preview/privacy/package-visibility-use-cases
intent filter 签名
https://developer.android.google.cn/preview/privacy/package-visibility#intent-signature
如果您使用 Custom Tab 来打开 URL 链接,您也许会调用 resolveActivity() 和 queryIntentActivities() 来启动一个非浏览器应用 (前提是您安装了处理该 URL 的应用)。在 Android 11 中,则有更好的办法来对此进行处理: 使用 intent 的 FLAG_ACTIVITY_REQUIRE_NON_BROWSER 标记,而不是去查询其他的应用。如果在您使用此标记调用 startActivity() 时启动了浏览器,则会抛出一个 ActivityNotFoundException 异常,此时您的应用可以对此异常进行处理,转而使用 Custom Tab 来打开 URL 链接。
try { val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply { // 非浏览器应用会直接处理该 URL(默认情况下) // 用户也可以在消除歧义对话框中选择非浏览器应用 addCategory(CATEGORY_BROWSABLE) flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER } startActivity(intent) } catch (e: ActivityNotFoundException) { // 只能使用浏览器应用,或者默认使用浏览器处理该 intent。 }
Custom Tab
https://developers.google.cn/web/android/custom-tabs
更好的办法
https://developer.android.google.cn/preview/privacy/package-visibility-use-cases#avoid-a-disambiguation-dialog
FLAG_ACTIVITY_REQUIRE_NON_BROWSER
https://developer.android.google.cn/preview/privacy/package-visibility#web-intent-non-browser-app
在极少数情况下,您的应用可能需要查询设备上所有已安装的应用或与之进行交互,不管这些应用包含哪些组件。为了允许您的应用看到其他所有已安装应用,Android 11 引入了 QUERY_ALL_PACKAGES 权限。在即将发布的政策更新中,Google Play 会为需要 QUERY_ALL_PACKAGES 权限的应用提供相关指南。 您可以将 API Level 设为 30,并使用 Android Studio 3.2 以上和最新发布的相应 Android Gradle 插件,即可在应用中添加 元素。您可以在开发者文档 — Android 11 中的软件包可见性中找到更多有关软件包可用性的使用信息和用例。
QUERY_ALL_PACKAGEShttps://developer.android.google.cn/preview/privacy/package-visibility#all-apps
开发者文档 — Android 11 中的软件包可见性https://developer.android.google.cn/preview/privacy/package-visibility
Android Studio 和 Gradle 对该功能的支持
如果您使用的 Android Gradle 插件版本是 4.1 和以上版本的话,就可以正常使用新的 元素,因为旧版本的 Gradle 插件并不兼容此元素。如果您使用了 ,或者是依赖了支持 Android 11 的库或 SDK,则可能会引起 manifest 冲突从而出现合并 manifest 的错误。例如,在构建应用时,在 Build Output Window 中可能会看到以下错误:
Android resource linking failed /Users/sample/AndroidStudioProjects/MyApp/app/build/intermediates/merged_manifests/debug/AndroidManifest.xml:18: error: unexpected elementfound in
在 Build Output Window 中可能还会出现这样一条错误信息,引导您去查看 Manifest 合并日志 (Manifest merger logs):
Manifest merger failed with multiple errors, see logs
展开 Merged Manifest 视图后,会出现一条附加的报错信息:
Error: Missing 'package' key attribute on element package
Merged Manifest 视图
https://developer.android.google.cn/studio/build/manifest-merge#inspect_the_merged_manifest_and_find_conflicts
修复 Android Gradle 插件的问题
解决以上错误的最好办法就是将 Android Gradle 插件升级到 4.1 Beta 版本。 但是,并不是所有开发者都能够使用最新的版本,一些项目中可能会依赖老版本的 Gradle 或者代码库,而它们与 4.1 版本的 Android Gradle 插件有兼容性问题。 因此,近期我们为 Android Gradle 插件发布了一个小版本 (dot releases) 的升级,以便兼容
Android Gradle 插件升级到 4.1 Beta 版本https://developer.android.google.cn/studio/releases/gradle-plugin#updating-plugin
小版本 (dot releases) 的升级https://developer.android.google.cn/studio/releases/gradle-plugin#4-0-0
举个例子,如果您正在使用 4.0.0 版本的 Android Gradle 插件,就可以在项目级别的 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' } }
感谢各位的阅读,以上就是“Android 11中的软件包可见性是什么”的内容了,经过本文的学习后,相信大家对Android 11中的软件包可见性是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!