返回顶部
首页 > 资讯 > 移动开发 >Android13适配
  • 838
分享到

Android13适配

Android13targetsdk33Android适配 2023-09-01 21:09:14 838人浏览 独家记忆
摘要

遇到的一些问题 WEBChromeClient的 api onReachedMaxAppCacheSize 没了 'onReachedMaxAppCacheSize' overrides nothing // 扩充缓存的容量

遇到的一些问题

WEBChromeClient的 api onReachedMaxAppCacheSize 没了

'onReachedMaxAppCacheSize' overrides nothing

    // 扩充缓存的容量        override fun onReachedMaxAppCacheSize(            spaceNeeded: Long, totalUsedQuota: Long, quotaUpdater: QuotaUpdater        ) {            quotaUpdater.updateQuota(spaceNeeded * 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,另一方面代码中需动态申请该通知栏权限。

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

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

val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManagerif (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);    }}
class TestNavigationActivity : AppCompatActivity() {    companion object {        const val TAG = "TestNavigationActivityTAG"    }    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_test_navigation)        checkAndShow()    }    private fun checkAndShow() {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {            val manager = getSystemService(NotificationManager::class.java)            val flag = manager.areNotificationsEnabled()            if (!flag) {                requestPermission(PermissionWrapper(POST_NOTIFICATIONS, 1001))            }        }    }    private fun checkPermission(permission: String): Boolean {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {            return true        }        return (ContextCompat.checkSelfPermission(            this, permission        ) == PackageManager.PERMISSION_GRANTED)    }    private fun requestPermission(permission: PermissionWrapper) {        if (checkPermission(permission.name)) {            Toast.makeText(this, "已授予权限:" + permission.name, Toast.LENGTH_LONG).show()            Log.v(TAG, "已授予权限:" + permission.name)        } else {            Toast.makeText(this, "未授予权限:" + permission.name + ",尝试获取权限...", Toast.LENGTH_LONG)                .show()            Log.v(TAG, "未授予权限:" + permission.name + ",尝试获取权限...")            ActivityCompat.requestPermissions(this, arrayOf(permission.name), permission.code)        }    }    data class PermissionWrapper(val name: String, val code: Int)    override fun onRequestPermissionsResult(        requestCode: Int, permissions: Array, grantResults: IntArray    ) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults)        val result = StringBuilder().apply {            append("请求码:$requestCode")            append("-权限:")            permissions.forEach {                append(it)            }            append("-授权结果:")            grantResults.forEach {                append(it)            }        }.toString()        Toast.makeText(this, result, Toast.LENGTH_LONG).show()        Log.v(TAG, result)    }}
V/TestNavigationActivityTAG: 未授予权限:android.permission.POST_NOTIFICATIONS,尝试获取权限... V/TestNavigationActivityTAG: 请求码:1001-权限:android.permission.POST_NOTIFICATIONS-授权结果:0

拿到权限后才能发送通知,代码如下:

class TestNavigationActivity : AppCompatActivity() {    companion object {        private const val TAG = "TestNavigationActivityTAG"        private const val CHANNEL_ID = "myApplication_channel_1"        private const val CHANNEL_NAME = "myApplication_channel_name"        private const val NOTIFICATION_ID_MSG = 100    }    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_test_navigation)        checkAndShow()    }    private fun checkAndShow() {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {            val manager = getSystemService(NotificationManager::class.java)            val flag = manager.areNotificationsEnabled()            if (!flag) {                requestPermission(PermissionWrapper(POST_NOTIFICATIONS, 1001))            } else {                showNotification()            }        }    }    private fun checkPermission(permission: String): Boolean {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {            return true        }        return (ContextCompat.checkSelfPermission(            this, permission        ) == PackageManager.PERMISSION_GRANTED)    }    private fun requestPermission(permission: PermissionWrapper) {        if (checkPermission(permission.name)) {            Toast.makeText(this, "已授予权限:" + permission.name, Toast.LENGTH_LONG).show()            Log.v(TAG, "已授予权限:" + permission.name)        } else {            Toast.makeText(this, "未授予权限:" + permission.name + ",尝试获取权限...", Toast.LENGTH_LONG)                .show()            Log.v(TAG, "未授予权限:" + permission.name + ",尝试获取权限...")            ActivityCompat.requestPermissions(this, arrayOf(permission.name), permission.code)        }    }    data class PermissionWrapper(val name: String, val code: Int)    override fun onRequestPermissionsResult(        requestCode: Int, permissions: Array, grantResults: IntArray    ) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults)        val result = StringBuilder().apply {            append("请求码:$requestCode")            append("-权限:")            permissions.forEach {                append(it)            }            append("-授权结果:")            grantResults.forEach {                append(it)            }        }.toString()        Toast.makeText(this, result, Toast.LENGTH_LONG).show()        Log.v(TAG, result)    }    private fun showNotification() {        val intent = Intent(this, NotificationResultMainActivity::class.java)        val manager = getSystemService(NotificationManager::class.java)        val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE)        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {            val channel =                NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH)            channel.setShowBadge(true)            manager.createNotificationChannel(channel)        }        val builder = NotificationCompat.Builder(this@TestNavigationActivity, CHANNEL_ID)            .setContentTitle("重要通知")            .setContentText("重要通知")            .setSmallIcon(R.mipmap.ic_launcher)            .setLargeIcon(BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher))            .setAutoCancel(true)            .setNumber(999)            .addAction(R.mipmap.ic_launcher, "去看看", pendingIntent)            .setCategory(NotificationCompat.CATEGORY_MESSAGE)            .setVisibility(NotificationCompat.VISIBILITY_PRIVATE)        manager.notify(NOTIFICATION_ID_MSG, builder.build())    }}

 

来源地址:https://blog.csdn.net/zhangying1994/article/details/128408176

--结束END--

本文标题: Android13适配

本文链接: https://www.lsjlt.com/news/389705.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android13适配
    遇到的一些问题 WebChromeClient的 API onReachedMaxAppCacheSize 没了 'onReachedMaxAppCacheSize' overrides nothing // 扩充缓存的容量 ...
    99+
    2023-09-01
    Android 13 target sdk 33 Android 适配
  • android相机、相册相关(android13 适配)13又又又又又又搞事,让第三方难以生存,踩坑
    前几天公司开发的新项目要上线,结果...... 由于项目中有用户更换头像功能,应用市场经过检测android13无法更换头像,也没有崩溃也没有反应,所以App就被无情退回,相当无奈,那就查问题,手头有没有android13测试机,怎么办,怎...
    99+
    2023-09-11
    android
  • Rockchip Android13 GKI开发指南
    Rockchip Android13 GKI开发指南 文章目录 Rockchip Android13 GKI开发指南@[toc]1 GKI介绍1.1 什么是GKI1.2 什么产品需要使用...
    99+
    2023-09-20
    android GKI EDLA ROCKCHIP kernel
  • Android13新功能有哪些
    本文小编为大家详细介绍“Android13新功能有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android13新功能有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。新功能和API带主题的应用图标让应...
    99+
    2023-07-05
  • Android13通知运行时权限
    部分应用更新到Android13以上之后,没有横幅(在屏幕上弹出)通知了。 Android 13(API 级别 33)及更高版本支持用于从应用发送非豁免(包括前台服务 [FGS])通知的运行时权限:POST_NOTIFICATIONS。此更...
    99+
    2023-09-09
    android
  • Android13 --- POST_NOTIFICATIONS权限无法关闭
       Android 13(API 级别 33)及更高版本支持用于从应用发送非豁免(包括前台服务 [FGS])通知的运行时权限:POST_NOTIFICATIONS。此更改有助于用户专注于最重要的通知。通知运行时权限  |  Android...
    99+
    2023-08-31
    android
  • Android13 网络 Adb 默认开启
    Android 13 网络 Adb 默认开启 文章目录 Android 13 网络 Adb 默认开启一、前言二、默认adb 代码实现1、修改的目录:2、具体修改:(1)在XXX_device....
    99+
    2023-09-08
    网络 adb 数据库
  • 1+6t刷个lineage OS 20(Android13)
      在小黄鱼上买了一台1+6t(8+256)(屏幕指纹损坏)本来想安个win11结果由于硬件问题每次安装都卡死在下图这个状态,于是就想刷个别的系统看看。 这个问题也可以解决 按住shift+f10(或者shift+Fn+f10),输入r...
    99+
    2023-08-31
    adb
  • Android 14适配
    Google I/O 2023 发布的 Android beta2 ,Android 14 将在2023年第三季度发布。Google Play 已经开始强制要求targetSdkVersion 33适配,所以 targetSdkVersio...
    99+
    2023-09-04
    Android 14 前台服务 安全 targetSdk 34 intent适配
  • Android深色模式适配适配过程详解
    目录Android 深色模式适配深色主题背景在应用中支持深色主题背景主题背景和样式Force Dark在视图上停用 Force DarkAndroid 10以上配置变更 Andro...
    99+
    2023-05-14
    Android深色模式 Android暗色模式 Android夜间模式
  • Android13 加强Intent filters 的安全性
    目录Intent filters block non-matching intents具体变更豁免适配办法残留Safer exporting of context-registere...
    99+
    2024-04-02
  • Android eSIM-LPA基于Android13的实现
    eSIM-Android-LPA基于 Android 13的实现 国际对ESIM相关所有规范定义在:GSMA Spec (SGP) - eSIM Consumer and IoT Specificat...
    99+
    2023-09-22
    android eSIM LPA
  • Android icon适配mipmap
    android app图标适配 基础配置 使用图片技巧 mipmap-ldpi 36*36 px 四周留出1个像素用于填充(无底色) mipmap-mdpi 48*48 px...
    99+
    2022-06-06
    Android
  • iOS15适配小结
    目录1、tabbar及navicationbar的背景颜色问题原因:因为设置颜色方法在ios15中失效解决方法--重新设置相关属性2、tableview新属性-sectionHead...
    99+
    2022-05-27
    iOS15 适配
  • Flutter:屏幕适配
    flutter_screenutil flutter_screenutil是一个用于在Flutter应用程序中进行屏幕适配的工具包。它旨在帮助开发者在不同屏幕尺寸和密度的设备上创建响应式的UI布局。 ...
    99+
    2023-09-25
    flutter
  • springmvc3个适配器
    SimpleControllerHandlerAdapterpublic class SimpleControllerHandlerAdapter implements HandlerAdapter { @Override ...
    99+
    2023-01-31
    适配器
  • activiti6.0是否适配springboot2.0
    activiti6.0是否适配springboot2.0,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。activiti6.0适配springboot2.0已适配...
    99+
    2023-06-19
  • iOS 16 版本适配
    iOS 16 真机调试时需要在设备的设置 —> 隐私与安全 —> 开发者模式 中打开开发者模式。 隐私权限增强,如通过 UIDevice 获取设备名称时,无法获取用户的信息,只能获取设备对应的名称([UIDevice currentDevi...
    99+
    2023-09-30
    ios iOS版本适配
  • 分析SpringBatch适配器
    本篇内容介绍了“分析SpringBatch适配器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、SpringBatch适配器SpringB...
    99+
    2023-06-25
  • Android13新特性之通知权限提升
    Android13新特性之通知权限提升 随着移动通信的高速发展,保障通信的安全性变得尤为重要。在Android 13的最新版本中,通知权限的管理得到了进一步加强。为了实现安全的通信和确保用户的隐私,...
    99+
    2023-09-26
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作