IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android URL scheme跳转失败(源码实现&排查思路&知识拓展) -> 正文阅读

[移动开发]Android URL scheme跳转失败(源码实现&排查思路&知识拓展)

目录

问题

实现

排查思路

知识拓展

包可见性

scheme

targetsdkVersion


  • 问题

App A的Activity A通过scheme跳转至App B的Activity B,跳转失败。

  • 实现

1. App A和App B约定scheme。App A跳转代码如下:

Intent intent = new Intent(Intent.ACTION_VIEW,
       Uri.parse("appb://targetactivity/web?url=XXX"));
//发出 Intent 之前必须通过 resolveActivity 检查,避免找不到合适的调用组件,造成 ActivityNotFoundException 的异常
if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ 
ONLY) != null) { 
      mContext.startActivityForResult(intent, 0); 
}else { 
      // 找不到指定的 Activity 
}

2. 在App B承接的Activity中注册intent-filter。App B承接代码如下:

<activity android:name=".MainActivity"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
           android:host="targetactivity"
           android:scheme="appb" />
    </intent-filter>
</activity>
  • 排查思路

上述代码在相关机型上未跳转成功,测试数款机型,发现只有android11及以上机型存在问题,故而怀疑是android11的隐私权和安全性更严格导致的。

查阅官网Android 11 中的软件包可见性管理软件包可见性,我们发现:如果您的应用以 Android 11(API 级别 30)或更高版本为目标平台,并且需要与应用(自动可见的应用除外)交互,请在您应用的清单文件中添加 <queries> 元素。

换而言之,当你不加<queries>元素 ,targetSDKVersion为30及以上且手机是android11及以上是无法跳转的。

App A中注册以下代码即可解决。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.XXX.myapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW"/>
            <data
                android:host = "targetactivity"
                android:scheme = "appb"/>
        </intent>
    </queries>
    <application
       <!--XXXX-->
    </application>

</manifest>
  • 知识拓展

  • 包可见性

Android 11 更改了应用查询用户已在设备上安装的其他应用以及与之交互的方式。使用<queries> 元素,应用可以定义一组自身可访问的其他软件包。通过告知系统应向您的应用显示哪些其他软件包,此元素有助于鼓励最小权限原则。参考:Android 11 中的软件包可见性管理软件包可见性

  • scheme

一个完整的完整的URL Scheme协议格式由scheme、host、port、path和query组成,其结构如下所示:

<scheme>://<host>:<port>/<path>?<query>

scheme可以是常见的协议名 (http、file等)也可以是自定义的协议名(自定义一个字符串即可),一般打开一个APP,大多使用自定义的协议名。参考:Android URL Scheme

  • targetsdkVersion

Android 会随新版本的推出而逐渐发展,在此过程中,某些行为乃至外观可能会发生变化。不过,如果平台的 API 级别高于应用 targetSdkVersion 所声明的版本,系统便可通过启用兼容性行为,确保应用继续以您所期望的方式工作。您可以将 targetSdkVersion 指定为符合应用所运行平台的 API 级别,从而停用此类兼容性行为。参考:<uses-sdk>

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 12:09:58  更:2021-08-30 12:11:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 5:35:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码