Android 11判断应用已安装坑点

文章目录

  • Android 11 wxApi.isWXAppInstalled() 返回false
    • 解决办法
      • 1、在清单文件的添加queries标签
      • 2、增加权限
      • 3、app的targetSdkVersion 改为29
    • 原因与说明
  • Android 11 获取已安装app列表问题
  • Android 11 应用可见性官方说明
    • 特定软件包名称
    • 在库中与托管应用通信
    • 与 intent 过滤器签名匹配的软件包
    • 使用特定授权的软件包
    • 所有应用(不推荐)


一个很久没有大更新的app,接用户反馈购买课程微信支付不了,通过app、后端的日志查看,确实有多次选择微信下单却未支付的操作。后来在一同事手机上复现,(app提示微信未安装,事实上已经安装)经过很久的折腾,得到结论。app调用的 wxApi.isWXAppInstalled() 来判断微信是否安装。最终在腾讯文档中找到了说明,原因是Android 应用可见性,要求做适配。

Android 11 wxApi.isWXAppInstalled() 返回false


解决办法

以下方法任意一种都可以解决问题

1、在清单文件的添加queries标签

manifest节点添加如下内容:

   <queries><package android:name="com.tencent.mm" /></queries>

具体位置如下所示

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

由于是新的标签,因此需要升级开发工具,否则会出现编译错误:

1)Android Studio 需要升级至 3.3 及以上,建议升级至 4.0 及以上版本;

2)Android SDK Build-Tools 需要升级至 30 及以上版本;

3)com.android.tools.build:gradle 需要升级至 3.6.0 版本,建议升级至最新的 3.6.4 版本。

2、增加权限

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

3、app的targetSdkVersion 改为29

这种方法也能解决上面问题,但实际上也留下了一个坑,时间一久,自己或其他小伙伴把apilevel 升上去,再次入坑。

原因与说明

主要原因是因为Android 11加强了应用可见性,原来的调用方式没有变,但系统内部是做了更苛刻的条件进行判断。什么是可见性?,在这里可见性指其他应用是否能被当前应用检测到(是否已经安装了某个app,一般这种需求不多或特定应用才会检测是否已经安装某个app)。
微信SDK内部是封装了对微信应用的检测,源码:

public final boolean isWXAppInstalled() {if (this.detached) {throw new IllegalStateException("isWXAppInstalled fail, WXMsgImpl has been detached");} else {try {PackageInfo var1;return (var1 = this.context.getPackageManager().getPackageInfo("com.tencent.mm", 64)) == null ? false : WXApiImplComm.validateAppSignature(this.context, var1.signatures, this.checkSignature);} catch (NameNotFoundException var2) {return false;}}}

其中就获取”com.tencent.mm“ 的packageInfo,在Android 11上,代码执行是异常的,所以返回的一致是false。
Android 11 系统策略更新,请开发者及时适配

<manifest package=“com.example.app”>

// 在应用的AndroidManifest.xml添加如下标签

// 指定微信包名


</manifest>

添加以上标签之后,需要开发者升级编译工具,否则会出现编译错误。

1)Android Studio 需要升级至 3.3 及以上,建议升级至 4.0 及以上版本;

2)Android SDK Build-Tools 需要升级至 30 及以上版本;

3)com.android.tools.build:gradle 需要升级至 3.6.0 版本,建议升级至最新的 3.6.4 版本。

Android 11 获取已安装app列表问题

其实还是来自第一个问题,既然指定单个包名获取不到packgeinfo,那么获取所有的应用之后,进行匹配会如何,答案是否定的。

var pkgs = packageManager.getInstalledPackages(0)
var apps = packageManager.getInstalledApplications(0);

getInstalledApplications 是新的接口。如上两个接口返回的列表,在Android 11上,正常情况下返回了系统预装的app和当前app的packageinfo,不会返回其他已安装应用,因此替代单一包名的检测是行不通的。重要的是那些管理手机应用的app此时就需要采用上面第二种方法了,否则获取不到其他app。

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

Android 11 应用可见性官方说明

Android 11可见性官方说明

您的App运行在Android 11(API 级别 30)或更高版本系统,默认情况下,系统会自动让部分应用对您的app可见,但会过滤掉其他应用。本指南将介绍如何让上述其他应用对您的app可见。

如果您的应用以 Android 11 或更高版本为目标平台,并且需要与应用(自动可见的应用除外)交互,请在您应用的清单文件中添加 <queries> 元素。在<queries> 元素中,按软件包名称、按 intent 签名或按 Provider 授权指定其他应用,如以下部分所述。

特定软件包名称

如果您知道要查询或与之交互的一组特定应用(例如,与您的应用集成的应用或您使用其服务的应用),请将其包名添加到 <queries> 元素内的一组 <package> 元素中:

<manifest package="com.example.game"><queries><package android:name="com.example.store" /><package android:name="com.example.services" /></queries>...
</manifest>

注意:如果在应用的清单中声明了 <package> 元素,则与该软件包名称关联的应用会出现在对 PackageManager 进行的任何与该应用的组件匹配的查询的结果中。

在库中与托管应用通信

如果要开发 Android 库,可以通过在 AAR 清单文件中添加 <queries> 元素来声明软件包可见性需求。此 <queries> 元素与应用可在自己的清单中声明的元素功能相同。

如果您的库涉及与“托管”应用通信(例如使用绑定服务),请添加用于指定托管应用的软件包名称的 <package> 元素:

<!-- Place inside the <queries> element. -->
<package android:name=PACKAGE_NAME />

通过添加此声明,可以检查是否已安装托管应用并与之交互,例如通过调用 bindService() 来完成。此交互的结果是,使用这个库的调用方应用会自动对托管应用可见。

与 intent 过滤器签名匹配的软件包

您的应用可能需要查询一组具有特定用途的应用或与之交互,但您可能不知道要添加的具体软件包名称。在这种情况下,您可以在<queries> 元素中列出 intent 过滤器签名。然后,您的应用就可以发现具有匹配的 <intent-filter> 元素的应用。

以下示例允许您的应用看到支持 JPEG 图片共享功能的已安装应用:

<manifest package="com.example.game"><queries><intent><action android:name="android.intent.action.SEND" /><data android:mimeType="image/jpeg" /></intent></queries>...
</manifest>

<intent> 元素有一些限制:

  • 必须只添加一个 <action> 元素。
  • 不能在 <data> 元素中使用 path、pathPrefix、pathPattern 或 port 属性。系统的行为就像您将每个属性的值都设为通用通配符 (*) 一样。
  • 不能使用 元素的 mimeGroup 属性。
  • 在单个 元素的 元素中,以下每个属性最多使用一次:
    • mimeType
    • scheme
    • host
      可以在多个 <data> 元素之间分配这些属性,也可以在单个 <data> 元素中使用这些属性。

<intent> 元素支持通用通配符 (*) 作为一些属性的值:

  • <action> 元素的 name 属性。
  • <data> 元素的 mimeType 属性的子类型 (image/*)。
  • <data> 元素的 mimeType 属性的类型和子类型 (/)。
  • <data> 元素的 scheme 属性。
  • <data> 元素的 host 属性。
    除非前面列表中另有说明,否则系统不支持混合使用文本和通配符,如 prefix*。

使用特定授权的软件包

如果您需要查询 Content Provider 但不知道具体的软件包名称,您可以在 <provider> 元素中声明该提供程序授权,如以下代码段所示:

<manifest package="com.example.suite.enterprise"><queries><provider android:authorities="com.example.settings.files" /></queries>...
</manifest>

注意:如果 元素包含 元素,您可能会在 Android Studio 中看到与 <provider> 元素相关的编辑器警告。只要您使用的是 Android Gradle 插件的最新“点”版本,您的 build 就不受影响,因此您可以忽略该警告。如需了解详情,请参阅有关为 Android 11 中的软件包可见性准备 Gradle build 的博文。

可以在单个 <queries> 元素中声明所有提供程序授权。此格式取决于您声明提供程序授权的数量:

  • 单个 <provider> 元素
    在元素中,声明以英文分号分隔的授权列表。
  • 多个 <provider> 元素
    在每个元素中,声明单项授权或以英文分号分隔的授权列表。

所有应用(不推荐)

在极少数情况下,可能需要查询设备上的所有已安装应用或与之交互,不管这些应用包含哪些组件。为了允许您的应用看到其他所有已安装应用,系统会提供 QUERY_ALL_PACKAGES 权限。

下面列出了适合添加 QUERY_ALL_PACKAGES 权限的用例的一些示例:

  • 无障碍应用
  • 浏览器
  • 设备管理应用
  • 安全应用
  • 防病毒应用

不过,在绝大多数情况下,可以通过以下方式实现您应用的用例:与一组自动可见的应用交互,并在您的清单文件中声明您的应用需要访问的其他应用。为了尊重用户隐私,您的应用应请求应用正常工作所需的最小软件包可见性。

这项来自 Google Play 的政策更新为需要 QUERY_ALL_PACKAGES 权限的应用提供了相关准则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python推导式多行书写_python三种推导式的详细介绍及其应用示例,强调字典推导的重要性...

前言列表推导式构建列表的快捷方式&#xff0c;而生成器表达式则可以用来创建其他任何类型的序列。自python2.7以后&#xff0c;列表推导和生成器表达式的概念就应用到了字典上&#xff0c;所以就有了字典推导&#xff0c;以后我们还会遇到集合推导(此处暂不讨论)。因此&#x…

Linux watch命令使用介绍

文章目录1&#xff0e;命令格式2&#xff0e;命令功能3&#xff0e;命令参数4&#xff0e;示例1&#xff1a;每隔一秒高亮显示网络链接数的变化情况2&#xff1a;每隔一秒高亮显示http链接数的变化情况3&#xff1a;实时查看模拟攻击客户机建立起来的连接数4&#xff1a;监测当…

php7 setcookie无效_php COOKIE介绍和setcookie有时会在ie下失效问题

建立商业站点或者功能比较完善的个人站点&#xff0c;常常需要记录访问者的信息&#xff0c;在PHP中提供了两种方便的手段&#xff1a;session和cookie功能.为了永久的保持用户信息,则cookie是最便捷的手段.在这里我将为大家详细的讲解cookie的功能及使用方法.一: 设置cookie使…

Linux at命令使用介绍

目录1&#xff0e;命令格式2&#xff0e;命令功能3&#xff0e;命令参数4&#xff0e;示例1&#xff1a;三天后的下午 5 点执行 /bin/ls2&#xff1a;明天17点钟&#xff0c;输出时间到指定文件3&#xff1a;计划任务设定后&#xff0c;在没有执行之前&#xff0c;用atq命令来查…

arm ubuntu 编译boost_使用yocto工具编译qt5.9.6总结

运行平台&#xff1a;OKMX6DL-C编译平台&#xff1a;Ubuntu 14.04.6 LTS编译工具&#xff1a;arm-poky-linux-gnueabi-gcc&#xff08;gcc version 5.3.0 (GCC) &#xff09;qt源码&#xff1a;qt-everywhere-opensource-src-5.9.6.tar.xz参考&#xff1a;嵌入式开发之Qt-5.9.6…

Linux crond命令使用介绍

目录前言一、crond简介系统任务调度用户任务调度二、crond服务三、crontab命令详解1&#xff0e;命令格式2&#xff0e;命令功能3&#xff0e;命令参数4&#xff0e;常用方法1). 创建一个新的crontab文件2). 列出crontab文件3). 编辑crontab文件4). 删除crontab文件5). 恢复丢失…

Android App屏幕旋转要点

文章目录前言屏幕旋转“预热”android:screenOrientationandroid:configChangesAcitvity onConfigurationChanged(newConfig: Configuration?)代码控制方向跟随系统重力感应总结前言 关于app横竖全屏切换&#xff0c;大多数属于音视频播放类app&#xff0c;电子书、文档类的应…

HTML静态页面获取url参数和UserAgent

目录前言原因解决1、静态页面获取url的参数2、取useragent的值3、测试页面前言 接技术支持小伙伴信&#xff1a;有用户反馈app在华为设备上下载不了&#xff0c;以为是服务器覆盖的范围不够或服务器挂了&#xff0c;直到另一个客服同事发来一个录屏&#xff0c;基本知道原因&a…

python mad函数_Python函数的基本定义

老男孩教育的PYTHON自动化开发课程自2013年第1期到现在已经走到了第12期&#xff0c;2年半的时间里&#xff0c;我们每一期都在对课程细节进行不同程度的优化&#xff0c;课程总时长也从最开始的2个月延长至第12期的五到六月&#xff0c;更新内容足足翻了一倍多&#xff0c;我们…

Linux grep命令使用介绍

目录1&#xff0e;命令格式2&#xff0e;命令功能3&#xff0e;命令参数4&#xff0e;正&#xff08;规&#xff09;则表达式5&#xff0e;示例1&#xff1a;查找指定进程2&#xff1a;查找指定进程个数3&#xff1a;从文件中读取关键词进行搜索4&#xff1a;从文件中读取关键词…

Android手机或平板设置浏览器的UserAgent

目录前言修改UserAgent实操华为手机自带浏览器Chrome&#xff08;谷歌浏览器&#xff09;QQ浏览器UC浏览器360浏览器前言 移动互联网盛行的当下&#xff0c;网页在电脑端和移动设备&#xff08;包括手机&#xff0c;平板以及一些基于Android系统定制的设备&#xff09;的适配主…

android jni fork()子进程不运行_Android高级面试谈谈Zygote的理解

Zygoto的作用Zygoto的作用有两个&#xff1a;1. 启动SystemServer2. 孵化应用进程SystemServer也是通过Zygoto来启动的&#xff0c;因为SystemServer需要Zygoto初始化好的一些系统资源&#xff0c;包括常用的类、JNI函数、共享库等等&#xff0c;这些资源直接从Zygoto继承过来对…

送给女朋友的情话

风拂鹊桥霓裳起 与卿漫话风雨里 初识 那一年端午 带着无比喜悦与期待 搭上去福州的火车 那一年端午 从福州到泉州 再到柴塔 连地名都好有神秘的感觉 迷糊的眼镜和疲倦的神情&#xff0c;刚好匹配得上 从此有了我们的传说 到了2022的七月七&#xff0c;还是一如既往 小特效 图…

Linux chmod命令使用介绍

目录1. 命令格式2. 命令功能3. 命令参数必要参数选择参数权限代号4. 使用实例1&#xff1a;增加文件所有用户组可执行权限2&#xff1a;同时修改不同用户权限3&#xff1a;去除文件的权限4&#xff1a;使用“”设置权限5&#xff1a;对一个目录及其子目录所有文件添加权限其他一…

lazada发货_Lazada发货用什么物流?费用要多少?

有买家到Lazada店铺下单之后&#xff0c;卖家就要安排订单发货了。Lazada发货的管控也是比较严格的&#xff0c;各位卖家要及时发货。小编也遇到不少新手卖家的咨询&#xff0c;问Lazada发货方式有哪些&#xff1f;以及发货流程是怎样的&#xff1f;下面针对这些问题&#xff0…

iOS app中不能跳转到商店更新

文章目录问题&#xff1a;跳转没有反应延申说明问题&#xff1a;跳转没有反应 如果app在苹果商店中的访问地址中带有中文&#xff0c;直接使用带中文url是跳转不成功的&#xff0c;需要对这个带中文的url进行UrlEncode编码才能正常跳转。 本文仅针对这种情况&#xff0c;或许还…

导入表格只有一行 帆软_万万没想到!把x个表格合合合合成一份,10分钟就搞定...

正值年中&#xff0c;老板交代把上半年各个地区提交的数据表格做个汇总。怎么办&#xff1f;一个地区一张表打开华南区的表&#xff0c;复制】-打开汇总表-【粘贴】再打开华北区的表【复制】-打开汇总表-【粘贴】……类似的工作任务还真不少各个单位上交的报名表各部门的生产计…

ddrelease64 黑苹果_High Sierra 黑苹果构建 微星X99A GAMING PRO CARBON+i7 6800k+GTX1070

回复文章须知&#xff1a;在本站评论区回复文章的时候&#xff0c;请务必正确填写好你的【电子邮件】地址&#xff0c;正确的填写【电子邮件】你将可以在博主/其他本站网友回复你的时候会收到邮件通知&#xff0c;以便及时查看回复内容&#xff01;本教程仅供小白安装使用&…

macOS/iOS WKWebview 下载文件

WKWebview 下载文件需要通过JS注入的方式来下载。js下载的数据是base64编码的&#xff0c;回到给原生后&#xff0c;原生需要反编码后才是原始文件的数据。 具体步骤&#xff1a; 配置WKWebview的js回调句柄&#xff08;标识&#xff09;创建WKWebview并添加到视图上实现WKScr…

vim插件自动补齐_给VIM添加REPL

REPL: 读取-求值-输出”循环&#xff08;英语&#xff1a;Read-Eval-Print Loop&#xff0c;简称REPL&#xff09;是一个简单的&#xff0c;交互式的编程环境。python作为一个动态语言&#xff0c;REPL在开发过程中起到了很大的作用。可是一直以来用vim写python没有一个很好的&…