Android13适配

news2024/9/28 3:25:22

遇到的一些问题

1.WebChromeClient的 API onReachedMaxAppCacheSize 没了

'onReachedMaxAppCacheSize' overrides nothing

    // 扩充缓存的容量
        override fun onReachedMaxAppCacheSize(
            spaceNeeded: Long, totalUsedQuota: Long, quotaUpdater: QuotaUpdater
        ) {
            quotaUpdater.updateQuota(spaceNeeded * 2)
        }

2.WebSettings的setAppCacheEnabled(true) 没了

WebView调整:废弃setAppCacheEnabled与setForceDark方法;
(若设置 targetSdk>=33 则此项必需适配!)

修改为

 mWebSettings.setCacheMode(WebSettings.LOAD_DEFAULT);

IntentFilter

在之前版本的Android系统中,只需将android:exported设为true就可以跨应用显式启动Activity和Service,即使intent-filter中的action或者type不匹配,也能够启动。

为避免上述漏洞,Android 13增强了intent-filter的匹配过滤逻辑。在接收方的targetSdk == 33的情况下,如果intent-filter匹配命中,无论发送方的targetSdk版本如何,intent都将生效。

温馨提示:

以下几种情况不需要遵循intent-filter的匹配过滤逻辑:

  • 组件没有声明

  • 同一个App里的intent

  • 系统或Root进程发出的intent

BroadcastReceiver

以往的Android系统下,应用动态注册的BroadcastReceiver广播接收器会接收到任何应用发送的广播(除非该接收器使用了应用签名权限保护),这会使动态注册的广播接收器存在安全风险。

Android13要求,应用动态注册的广播接收器必须以显著的方式指出是否允许其他应用访问,即其他应用是否可以向其发送广播。否则,在动态注册时系统将抛出安全异常(SecurityException)。

目前该增强措施并非默认生效,开发者需启用 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED兼容性框架,并在动态注册广播时指定是否接受其他应用的广播:

context.registerReceiver(receiver, intentFilter, RECEIVER_EXPORTED)
context.registerReceiver(receiver, intentFilter, RECEIVER_NOT_EXPORTED)

权限

细分媒体权限

Google在Android 13上对本地数据访问权限做了更进一步的细化。

将 READ_EXTERNAL_STORAGE 细分为IAMGES、VIDEO、AUDIO权限, targetSdk>=33 此项必需适配。

从Android 13开始,系统新增运行时权限READ_MEDIA_IAMGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO 替代原有的READ_EXTERNAL_STORAGE权限。

权限权限说明
READ_MEDIA_IAMGES图片权限
READ_MEDIA_VIDEO视频权限
READ_MEDIA_AUDIO音频权限

当应用升级到targetSdk>=33时:

已授权READ_EXTERNAL_STORAGE权限的应用:系统将自动赋予对应的细化权限。
未授权仍请求READ_EXTERNAL_STORAGE权限:亲测系统将不会授予任何权限。

因此,API 32也就是Android 12及以下系统,我们仍然声明的是READ_EXTERNAL_STORAGE权限。从Android 13开始,我们就会使用READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO来替代了。

静态广播注册

从Android 13开始,注册静态广播时,需设置对其他应用的可见性:

若对其他应用可见,广播注册时设置:Context.RECEIVER_EXPORTED
若仅应用内使用,广播注册时设置:Context.RECEIVER_NOT_EXPORTED
 

// This broadcast receiver should be able to receive broadcasts from other apps.
// This option causes the same behavior as setting the broadcast receiver's
// "exported" attribute to true in your app's manifest.
context.registerReceiver(sharedBroadcastReceiver, intentFilter,
    RECEIVER_EXPORTED)

// For app safety reasons, this private broadcast receiver should **NOT**
// be able to receive broadcasts from other apps.
context.registerReceiver(privateBroadcastReceiver, intentFilter,
    RECEIVER_NOT_EXPORTED)

 通知权限

Android 13 引入了一种新的运行时通知权限:POST_NOTIFICATIONS。
POST_NOTIFICATIONS 权限级别被定义为dangerous 开发者使用该权限时需动态申请。

对于以Android13,在显示Android通知栏时,一方面需要在AndroidManifest中声明 android.permission.POST_NOTIFICATION,另一方面代码中需动态申请该通知栏权限。

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="xxx.xxxx.xxxx">
    
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

 

EasyPermissions.requestPermissions(this, this.getString(R.string.ask_again),
		PermissionActivity.RC_PERMISSION_NOTIFICATIONS, Manifest.permission.POST_NOTIFICATIONS);

判断应用是否有能力发出通知让用户看到(各个系统版本上都是能正常工作):

val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
if (notificationManager.areNotificationsEnabled()) {
    // Permission granted
} else {
    // Permission not granted
}

Android 13上判断发送通知权限 :

if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
    == PackageManager.PERMISSION_GRANTED) {
    // Permission granted
} else {
    // Permission not granted
}

注意:一旦被用户拒绝授权,下次系统将不会再出现权限申请的弹窗。 

引导用户前往设置界面打开通知权限。代码如下:

private void goSetting() {
    final ApplicationInfo applicationInfo = getApplicationInfo();

    try {
        Intent intent = new Intent();
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
        intent.putExtra("app_package", applicationInfo.packageName);
        intent.putExtra("android.provider.extra.APP_PACKAGE", applicationInfo.packageName);
        intent.putExtra("app_uid", applicationInfo.uid);
        startActivity(intent);
    } catch (Throwable t) {
        t.printStackTrace();
        Intent intent = new Intent();
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
        intent.setData(Uri.fromParts("package", applicationInfo.packageName, null));
        startActivity(intent);
    }
}

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

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

相关文章

QT学习笔记(下)

项目实践 前言 本项目的实践主要是以翻金币的项目为例&#xff0c;进行QT项目的实践。游戏分为3个场景&#xff0c;分别是mainscene主场景、chooselevelscene选择关卡场景、playscene游戏场景&#xff0c;以上的三个场景是按顺序实现的。并且定义了两个自定义的QPushButton按…

数据库,计算机网络、操作系统刷题笔记24

数据库&#xff0c;计算机网络、操作系统刷题笔记24 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

c++下 ADO+配置数据源连接oracle数据库

测试环境&#xff1a;在本地局域网内远程连接服务器端的oracle数据库&#xff0c;VS2013、ADO方式。2、本地安装oracle数据库客户端&#xff0c;具体是安装32位还是64位的数据库客户端&#xff0c;取决于我们编译的程序是32位的还是64位的&#xff08;和计算机的系统位数没有关…

首款通过! 机器学习服务活体检测算法荣获CFCA权威安全认证

随着人脸识别技术在金融、医疗等多个领域的加速落地&#xff0c;网络安全、信息泄露等问题愈为突出&#xff0c;用户对应用稳定性和安全性的要求也更为严格。为保障各行业高效稳定的开展业务&#xff0c;提前发现和应对潜在安全风险&#xff0c;华为 HMS Core 机器学习服务&…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的图神经网络模型

给我推荐20个比较流行的图神经网络模型 很高兴为您推荐流行的图神经网络模型。这里是我的推荐列表&#xff1a; 卷积神经网络 (CNN) 递归神经网络 (RNN) 自注意力机制 (Transformer) 双向递归神经网络 (BRNN) 门控循环单元 (GRU) 长短期记忆网络 (LSTM) 双流图神经网络 (Bi-D…

鲁大师2022牛角尖颁奖盛典落幕,年度最强产品揭晓!

1月4日&#xff0c;鲁大师2022年度牛角尖颁奖晚会在湖北襄阳成功举办。鲁大师的”牛角尖”奖是由过去一年上亿用户通过鲁大师测试得到的真实数据&#xff0c;以及鲁大师实验室通过专业的测试规范共同缔造的硬件奖项。颁发给的都是各大PC、手机、电动车领域最优秀、最顶尖的产品…

JAVA 的内存泄露分析

背景 前不久&#xff0c;上线了一个新项目&#xff0c;这个项目是一个压测系统&#xff0c;可以简单的看做通过回放词表&#xff08;http请求数据&#xff09;&#xff0c;不断地向服务发送请求&#xff0c;以达到压测服务的目的。在测试过程中&#xff0c;一切还算顺利&#x…

统一网关Gateway

网关功能&#xff1a; 身份验证、权限校验服务路由、负载均衡请求限流 网关实现技术&#xff1a; gatewayzuul Zuul是基于Servlet的实现&#xff0c;属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux&#xff0c;属于响应式编程的实现&#xff0c;具备更…

Servlet 综合案例(empProject)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

计算机网络进阶 ---- 网络类型 ---- 二层封装协议 ---- HDLC ---- PPP ---- pap认证 ---- chap认证 ---- 详解

一、网络类型&#xff1a; 【1】点到点 &#xff08;Peer to Peer – p2p&#xff09; ---- 在一个网段中&#xff0c;只能部署两个节点&#xff1b;【2】MA&#xff08;Multiple Access&#xff09; ---- 多路访问 ---- 一个网段中&#xff0c;可以部署的节点数量不限制&…

经典文献阅读之--OV2SLAM(高速视觉slam)

0. 简介 视觉里程计最近几年越来越受到学术界以及工业界的认可&#xff0c;以ORB和VINS为代表的视觉SLAM已经可以满足绝大多数场景&#xff0c;而OV2SLAM在其他VSLAM中脱颖而出&#xff0c;其实时性以及具体的回环性能在测试中都得到了认可。下面我们就来看一下《OV2SLAM : A …

TiDB分布式数据库架构介绍

简介 TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库&#xff0c;是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品&#xff0c;具备水平扩容或者缩容、金融级高可用、实时 HTAP、云…

Syncfusion Essential Studio Enterprise新功能

Syncfusion Essential Studio Enterprise新功能 添加了新的MediaQuery、Menute和Rating组件。 应用程序栏、浮动操作按钮、消息和快速拨号组件现在可以在生产中使用。 添加了对甘特图中按需加载的支持。 ASP.NET核心 添加了新的分级控件。 应用程序栏、浮动操作按钮、提及、消息…

什么是密码管理器?它安全吗?

密码管理器或密钥管理员是一类用于生成、检索、保存及管理复杂密码、数字签名的措施&#xff0c;可以由硬件或软件实现。因此&#xff0c;密码管理器一般也称作密码管理软件。复杂密码的生成一般按需要以随机算法产生&#xff0c;而密码数据则保存于一个以密码、数字签名等方式…

DP刷题(一)

目录 拆分单词 牛客题霸_牛客网 【思路梳理】​ 剑指 Offer II 100. 三角形中最小路径之和 【解法一】自顶向下 【解法二】自底向上 路径的数目 剑指 Offer II 098. 路径的数目 【解法一】 【解法二】 路径的数目&#xff08;加入障碍物&#xff09;63. 不同路径 II 【解…

unity 简单实现三阶魔方游戏

unity 简单实现三阶魔方游戏 魔方体验地址 工程文件免费下载 实现思路 一、魔方的旋转 三阶魔方由26个方块与 9个旋转轴组成。旋转轴旋转时带动在其控制范围的方块旋转。 旋转轴如何带动方块旋转&#xff1f; 把旋转轴控制范围内的方块设置成旋转轴的子物体&#xff0c;…

必背经典!这些软件测试面试题及答案别放过!

对于很多软件测试新手来说&#xff0c;技术面试往往是整个面试体系里最让人头疼的部分&#xff0c;今天我为选取了软件测试面试中&#xff0c;一些经典的问题和答案&#xff0c;供大家参考使用。并且&#xff0c;还给你们奉上了一个免费的面试刷题小程序哟&#xff01;拿走不谢…

调试前端代码二三事--(一)-调试基础

一&#xff0c;在网页上调试代码 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport…

房产管理系统中CAD图形管理分析

随着技术的不断进步和升级&#xff0c;以及高校房屋建筑物数量的不断扩充&#xff0c;建立房屋资产管理信息系统进行信息化、数字化、图形化房屋资产管理已经是势在必行。学校有庞大的房屋数据、大量的CAD图纸、复杂的房屋分类&#xff0c;建设房屋管理系统&#xff0c;能够加强…

JavaSE高级篇:运行时数据区

文章整理自深入理解Java虚拟机第一章概述第二章&#xff1a;运行时数据区域一&#xff1a;程序计数器二&#xff1a;Java虚拟机栈三&#xff1a;Java堆四&#xff1a;方法区五&#xff1a;运行时常量池六&#xff1a;直接内存第一章概述 Java程序员把内存控制的权利交给了JVM …