2024 年升级到 Android 14 的开发者是不是总遇到这些糟心事?之前好好的 APP 一升级就频繁闪退,点开相册权限弹窗弹个不停,用户投诉说 “刚点了允许又要重新授权”;网络请求更是离谱,明明加了权限,数据却死活加载不出来,日志里全是 “Cleartext HTTP not permitted” 的错误。别着急,兔子哥今年年初就踩过这些坑,一个资讯 APP 因为没适配 Android 14 的照片权限,用户上传头像时反复授权却用不了,差评涨了不少;还有个天气 APP,网络请求没处理好 HTTPS,在新系统上直接白屏,排查半天才发现是协议问题。今天就带大家把 Android 14 的权限适配和网络请求避坑技巧讲透,2024 年开发 APP 少走弯路,一起往下看吧!
一、Android 14 权限适配:这些新变化不处理,APP 准崩
基础问题:Android 14 权限变严了?哪些权限最容易出问题?
没错!Android 14 对用户隐私保护更严了,尤其是照片权限、通知权限和后台位置权限,这三类是新手最容易栽跟头的地方。以前申请一次照片权限就能访问所有照片,现在不行了,用户得一张一张选;通知权限也得用户主动打开,默认不给权限了。要是还按老方法适配,APP 要么功能失效,要么频繁闪退,对吧?
必做的 3 类权限适配步骤
照片权限:从 “批量授权” 到 “按需申请”
Android 14 把照片权限拆成了 “读取选定照片” 和 “读取所有照片”,不能一上来就申请所有权限了。
步骤:
kotlin// 申请选定照片val pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->if (uri != null) {// 处理选中的照片}}pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))在 AndroidManifest.xml 里加新权限:
先申请 “读取选定照片” 权限,用户选完照片后,用
ActivityResultContracts.PickVisualMedia获取选中的照片 URI;如果用户确实需要批量选图,再弹窗解释用途,申请 “读取所有照片” 权限,比如 “需要访问所有照片来批量上传相册”。
代码示例:通知权限:必须用户主动打开,默认无权限
Android 14 前,APP 安装后默认能发通知,现在不行了,得引导用户去设置里开权限。
步骤:调用
NotificationManager.areNotificationsEnabled()检查权限;没权限就弹对话框,说明为什么需要通知,比如 “开启通知才能接收消息提醒”;
引导用户跳转到通知设置页:
startActivity(Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { putExtra(Settings.EXTRA_APP_PACKAGE, packageName) })。后台位置权限:非必要不申请,申请必解释
后台位置权限(ACCESS_BACKGROUND_LOCATION)现在更难申请了,必须先获得前台位置权限,再单独申请后台权限,而且得在弹窗里写清楚 “为什么需要后台定位”,比如 “后台定位才能持续记录运动轨迹”。
注意:如果 APP 不是导航、运动类 APP,别申请这个权限,用户大概率会拒绝,还可能影响审核。
权限适配最容易踩的坑,避开就稳了
没处理权限被拒的场景:用户点了 “拒绝” 就不管了,结果功能卡住。解决:每次权限被拒后,都要显示友好提示,告诉用户 “需要权限才能使用该功能”。
同时申请多个权限:一打开 APP 就弹四五个权限弹窗,用户直接反感卸载。解决:按功能使用顺序申请,用到哪个功能再弹哪个权限。
用老权限名称:还在用
READ_EXTERNAL_STORAGE,Android 14 里这个权限已经失效了,得换成READ_MEDIA_IMAGES。
不过话说回来,权限适配虽然麻烦,但做好了能提升用户信任,毕竟谁也不喜欢 APP 乱要权限,对吧?
二、网络请求避坑:Android 14 对 HTTP 说 “不”,这些错误别再犯
场景问题:升级 Android 14 后,网络请求总失败?常见错误有哪些?
最常见的就是HTTP 请求被拦截和主线程网络请求。Android 14 默认禁止明文 HTTP 请求,必须用 HTTPS;而且网络请求如果在主线程执行,APP 直接闪退,比以前更严格了。
网络请求避坑指南,3 招搞定
从 HTTP 切换到 HTTPS,老接口怎么办?
Android 14 默认屏蔽 HTTP 请求,日志会提示 “Cleartext HTTP traffic to xxx not permitted”。
解决:优先让后端把接口升级到 HTTPS,这是最彻底的办法;
实在改不了的老接口,在 res/xml 里新建
network_security_config.xml,配置允许特定域名的 HTTP:xml<network-security-config><domain-config cleartextTrafficPermitted="true"><domain includeSubdomains="true">oldapi.example.comdomain>domain-config>network-security-config>
在 AndroidManifest.xml 的 application 标签里引用:
android:networkSecurityConfig="@xml/network_security_config"。网络请求必须放后台线程,主线程绝对不行
Android 14 对主线程网络请求查得更严了,只要在onCreate、onResume等主线程方法里直接发请求,必闪退。
解决:用协程或线程池把请求放后台,比如:
kotlin// 正确做法:用协程在IO线程执行lifecycleScope.launch(Dispatchers.IO) {val response = RetrofitClient.api.getdata()withContext(Dispatchers.Main) {// 回主线程更新UI}}
千万别图省事直接在主线程发请求,以前可能侥幸能跑,Android 14 里绝对不行。处理网络状态变化,别让用户对着白屏发呆
用户网络时好时坏,请求失败了要给明确提示,不能让界面一直卡在加载中。
解决:用
ConnectivityManager监听网络状态,没网时弹提示 “当前无网络,请检查连接”;给请求加超时时间,比如 Retrofit 设置
callTimeout(10, TimeUnit.SECONDS),超时后显示 “请求超时,请重试”。
三、实战测试:权限和网络适配后,必须做的 3 项测试
基础问题:适配完怎么知道没问题?哪些测试场景不能少?
光改代码不够,得模拟各种场景测试才行。尤其是用户拒绝权限、网络不稳定、老版本兼容这三种场景,最容易出问题但新手常忽略。
必做测试清单
权限拒绝测试:故意点 “拒绝” 权限,看 APP 是否崩溃,提示是否友好,比如照片权限被拒后,是否显示 “无法访问照片,请重新授权”。
弱网测试:用 Android Studio 的 “Network Profiler” 模拟 2G 网络,看请求超时处理是否生效,会不会一直转圈。
跨版本测试:在 Android 13、14 上都测一遍,有些权限在老版本写法不同,比如 Android 13 的照片权限和 14 就不一样,得兼容处理。
网友 “开发小王” 分享:“之前适配完没测弱网场景,上线后用户反馈‘加载半天没反应’,后来加了超时提示和重试按钮,差评立马少了,原来测试这么重要!”
四、自问自答:2024 年开发常问的适配问题
“Android 14 权限适配太复杂,能不能只适配到 Android 13?”
短期可以,但长期不行。2024 年新手机基本都是 Android 14,用户升级后 APP 出问题,会直接卸载。而且应用商店可能会要求新上架 APP 必须适配最新系统,所以早适配早省心。这或许暗示权限适配在新系统中更为关键,是未来开发的必备技能。
“网络请求用 OKHttp 还是 Retrofit?哪个更不容易踩坑?”
推荐用 Retrofit,它是在 OKHttp 基础上封装的,处理 HTTPS、超时、拦截器更方便。比如设置 HTTPS 证书、添加请求头,Retrofit 几行代码就搞定,比直接用 OKHttp 简单。
“不同手机厂商对权限的处理不一样,怎么办?”
确实,小米、华为这些厂商会定制权限逻辑,比如通知权限的设置路径可能不同。关于不同厂商对权限弹窗的定制逻辑,具体机制待进一步研究,但可以用第三方库(比如 “AppOpsManager”)统一处理,或者在社区查对应厂商的适配指南。
结尾心得
2024 年做 Android 开发,权限适配和网络请求是绕不开的坎,但只要按步骤来,也没那么难。兔子哥的经验是,权限适配别偷懒,用户拒绝时一定要有友好提示,别让 APP 直接崩;网络请求尽量用 HTTPS,后台线程执行,超时和错误处理要做全。测试时多模拟真实场景,比如在地铁里测弱网,故意拒绝权限看反应。其实用户不怕 APP 要权限,怕的是乱要权限还不说明用途;也不怕加载慢,怕的是加载失败没提示。把这些细节做好,你的 APP 在 Android 14 上就能跑得又稳又流畅,加油!
标签: ActivityResultContracts.PickVisualMedia.ImageOnly ActivityResultContracts.PickVisualMedia
还木有评论哦,快来抢沙发吧~