做兼职上哪个网站,中国邮政crm客户管理系统,海外市场推广策略,北京 网站建设 京icp文章目录Android 11 wxApi.isWXAppInstalled() 返回false解决办法1、在清单文件的添加queries标签2、增加权限3、app的targetSdkVersion 改为29原因与说明Android 11 获取已安装app列表问题Android 11 应用可见性官方说明特定软件包名称在库中与托管应用通信与 intent 过滤器签…
文章目录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节点添加如下内容 queriespackage android:namecom.tencent.mm //queries具体位置如下所示
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidpackage...queriespackage android:namecom.tencent.mm //queries.....
/manifest由于是新的标签因此需要升级开发工具否则会出现编译错误
1Android Studio 需要升级至 3.3 及以上建议升级至 4.0 及以上版本
2Android SDK Build-Tools 需要升级至 30 及以上版本
3com.android.tools.build:gradle 需要升级至 3.6.0 版本建议升级至最新的 3.6.4 版本。
2、增加权限
uses-permission android:nameandroid.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 添加以上标签之后需要开发者升级编译工具否则会出现编译错误。
1Android Studio 需要升级至 3.3 及以上建议升级至 4.0 及以上版本
2Android SDK Build-Tools 需要升级至 30 及以上版本
3com.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:nameandroid.permission.QUERY_ALL_PACKAGES/Android 11 应用可见性官方说明
Android 11可见性官方说明
您的App运行在Android 11API 级别 30或更高版本系统默认情况下系统会自动让部分应用对您的app可见但会过滤掉其他应用。本指南将介绍如何让上述其他应用对您的app可见。
如果您的应用以 Android 11 或更高版本为目标平台并且需要与应用自动可见的应用除外交互请在您应用的清单文件中添加 queries 元素。在queries 元素中按软件包名称、按 intent 签名或按 Provider 授权指定其他应用如以下部分所述。
特定软件包名称
如果您知道要查询或与之交互的一组特定应用例如与您的应用集成的应用或您使用其服务的应用请将其包名添加到 queries 元素内的一组 package 元素中
manifest packagecom.example.gamequeriespackage android:namecom.example.store /package android:namecom.example.services //queries...
/manifest注意如果在应用的清单中声明了 package 元素则与该软件包名称关联的应用会出现在对 PackageManager 进行的任何与该应用的组件匹配的查询的结果中。
在库中与托管应用通信
如果要开发 Android 库可以通过在 AAR 清单文件中添加 queries 元素来声明软件包可见性需求。此 queries 元素与应用可在自己的清单中声明的元素功能相同。
如果您的库涉及与“托管”应用通信例如使用绑定服务请添加用于指定托管应用的软件包名称的 package 元素
!-- Place inside the queries element. --
package android:namePACKAGE_NAME /通过添加此声明可以检查是否已安装托管应用并与之交互例如通过调用 bindService() 来完成。此交互的结果是使用这个库的调用方应用会自动对托管应用可见。
与 intent 过滤器签名匹配的软件包
您的应用可能需要查询一组具有特定用途的应用或与之交互但您可能不知道要添加的具体软件包名称。在这种情况下您可以在queries 元素中列出 intent 过滤器签名。然后您的应用就可以发现具有匹配的 intent-filter 元素的应用。
以下示例允许您的应用看到支持 JPEG 图片共享功能的已安装应用
manifest packagecom.example.gamequeriesintentaction android:nameandroid.intent.action.SEND /data android:mimeTypeimage/jpeg //intent/queries...
/manifestintent 元素有一些限制
必须只添加一个 action 元素。不能在 data 元素中使用 path、pathPrefix、pathPattern 或 port 属性。系统的行为就像您将每个属性的值都设为通用通配符 (*) 一样。不能使用 元素的 mimeGroup 属性。在单个 元素的 元素中以下每个属性最多使用一次 mimeTypeschemehost 可以在多个 data 元素之间分配这些属性也可以在单个 data 元素中使用这些属性。
intent 元素支持通用通配符 (*) 作为一些属性的值
action 元素的 name 属性。data 元素的 mimeType 属性的子类型 (image/*)。data 元素的 mimeType 属性的类型和子类型 (/)。data 元素的 scheme 属性。data 元素的 host 属性。 除非前面列表中另有说明否则系统不支持混合使用文本和通配符如 prefix*。
使用特定授权的软件包
如果您需要查询 Content Provider 但不知道具体的软件包名称您可以在 provider 元素中声明该提供程序授权如以下代码段所示
manifest packagecom.example.suite.enterprisequeriesprovider android:authoritiescom.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 权限的应用提供了相关准则。