Android 11 适配 软件包可见性

Posted Lucky_William

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 11 适配 软件包可见性相关的知识,希望对你有一定的参考价值。

android 11 软件包可见性 适配

一、软件包可见性说明

如果应用以 Android 11(API 级别 30)或更高版本为目标平台,在默认情况下,系统会自动让部分应用对您的应用可见,但会隐藏其他应用。
通过让部分应用在默认情况下不可见,系统可以了解应向应用显示哪些其他应用,这样有助于鼓励最小权限原则。

注意:

  1. 如果您的应用以 Android 10(API 级别 29)或更低版本为目标平台,那么全部应用均会自动对您的应用可见。
  2. 即使您的应用以 Android 11(API 级别 30)或更高版本为目标平台,特定场景不会受影响。

1. 不受影响的特定场景

  • 实现 Android 核心功能的某些系统软件包,如媒体提供程序。
  • 使用 startActivityForResult() 方法启动其他应用的某个页面。
  • 通过 Content Provider 访问的应用。
  • 具有 Content Provider 的任何应用,且应用已被授予 URI 权限来访问该 Content Provider。
  • 可以使用隐式或显式 intent 来启动另一应用的 activity,无论这个应用是否对您的应用可见。

2. 受影响的方法列表


    // 检索可以为给定意图执行的所有 activity
    PackageManager.queryIntentActivities(intent, flag)
    
	// 检索可以匹配给定意图的所有服务
    PackageManager.queryIntentServices(intent, flag)
        
    // 检索可以处理给定意图广播的所有接收器
    PackageManager.queryBroadcastReceivers(intent, flag)
        
    // 查询内容提供者
    PackageManager.queryContentProviders(processName, uid, flag)

    // 获取为当前用户安装的所有软件包的列表。
    PackageManager.getInstalledPackages(flag)

	// 获取已安装的应用程序
	PackageManager.getInstalledApplications(flag)
    

二、软件包可见性配置

1. 检查是否有可用浏览器,例如需要打开外部浏览器

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
        </intent>
    </queries>
</manifest>

2. 检查设备能否打开给定文件,如需要打开 pdf、zip

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <data android:mimeType="*/*" />
        </intent>
    </queries>
</manifest>

3. 创建自定义共享表单,如分享图片、文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="*/*" />
        </intent>
    </queries>
</manifest>

4. 显示自定义文字选择操作,如选中一段文字,进行复制、粘贴操作

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <queries>
        <intent>
            <action android:name="android.intent.action.PROCESS_TEXT" />
            <data android:mimeType="text/plain" />
        </intent>
    </queries>
</manifest>

5. 连接到文字转语音引擎

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <queries>
        <intent>
            <action android:name="android.intent.action.TTS_SERVICE" />
        </intent>
    </queries>
</manifest>

6. 连接到语音识别服务

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <queries>
        <intent>
            <action android:name="android.speech.RecognitionService" />
        </intent>
    </queries>
</manifest>

7. 显示联系人的自定义数据行

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <queries>
        <!-- Allows the app to read the "contacts.xml" file from the other apps. -->
        <intent>
            <action android:name="android.accounts.AccountAuthenticator" />
        </intent>
        <!-- Allows the app to load an icon corresponding to the custom MIME type. -->
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <data
                android:host="com.android.contacts"
                android:mimeType="vnd.android.cursor.item/*"
                android:scheme="content" />
        </intent>
    </queries>
</manifest>

8. 连接到媒体浏览器服务

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <queries>
        <intent>
            <action android:name="android.media.browse.MediaBrowserService" />
        </intent>
    </queries>
</manifest>

9. 配置访问 微信,支付宝,QQ,微博

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <queries>
        <!--微信-->
        <package android:name="com.tencent.mm" />

        <!--支付宝-->
        <package android:name="com.eg.android.AlipayGphone" />
        <package android:name="hk.alipay.wallet" />

        <!--QQ-->
        <package android:name="com.tencent.qqlite" />
        <package android:name="com.tencent.mobileqq" />

        <!--新浪微博-->
        <package android:name="com.sina.weibo" />
    </queries>
</manifest>

10. 配置查询所有应用及与之交互(以上均可不配置,但 gp 会严格审核)

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

附 Github 源码:

AndroidManifest.xml

以上是关于Android 11 适配 软件包可见性的主要内容,如果未能解决你的问题,请参考以下文章

如何从活动中更改片段中视图的可见性

如何维护适配器类中recyclerview项目的可见性

Android ViewPager 适配器修改其他页面

使用绑定从片段访问父活动的 UI 元素

android 11 kotlin 中的包可见性

在android的片段中设置列表视图适配器