Android 10 定位权限问题
年后项目升级到了安卓10 (Api29), 这几天在写定位遇到了的定位权限以及回调问题,记录下
随着Android 对用户隐私和安全问题逐渐重视, 版本适配问题越来越多,对于开发者来说也是一件很头痛的事
Android Q (29) 新增后台定位权限: ACCESS_BACKGROUND_LOCATION
,
如果项目编译版本>=29 且想要使用前台定位则需要在AndroidManifest.xml 添加下面这句权限
<!--定位权限 安卓9.0及以下用下-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--定位权限,Android Q 新增后台定位权限-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
申请权限需要判断编译版本了
//Android10以下申请定位权限
String[] permissionsO = new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION};
//Android 10及以上申请定位权限
String[] permissionsQ = new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION};
String[] permissions = permissionsO;
// 判断编译版本,如果大于等于29,就用permissionsQ
if (Build.VERSION.SDK_INT >= 29) {
permissions = permissionsQ;
}
本以为这就完事了, 结果自测的时候在Android10上发现一个问题: 在申请权限的时候如果点击了 仅使用期间允许 的话会执行拒绝的回调, 正常的情况下, 我们一般会有这几种回调(允许, 拒绝,拒绝后不在询问)
//这是我基于RXpermission 自行封装的
PermissionUtil.requestLocation(new PermissionUtil.RequestPermission() {
@Override
public void onRequestPermissionSuccess() {
//全部授权,开始定位
}
@Override
public void onRequestPermissionFailure(List<String> permissions) {
//拒绝,给个提示
}
@Override
public void onRequestPermissionFailureWithAskNeverAgain(List<String> permissions) {
//拒绝后不在询问,给个弹窗,是否去设置界面
}
}, new RxPermissions(this));
经过Debug 发现, 在Android10手机上如果点击仅使用期间执行的话,android.permission.ACCESS_BACKGROUND_LOCATION 这个权限返回的值是 -1 , 说明这个权限是没有申请成功的
所以,我的思路就是在onRequestPermissionFailure 这回调判断下,未授权的权限集合长度等于1,并且这个权限还是 "android.permission.ACCESS_BACKGROUND_LOCATION" , 说明另外两个定位已经授权了,
//基于RXpermission 自行封装的
PermissionUtil.requestLocation(new PermissionUtil.RequestPermission() {
@Override
public void onRequestPermissionSuccess() {
//全部授权,开始定位
}
@Override
public void onRequestPermissionFailure(List<String> permissions) {
if (null != permissions && permissions.size()==1 && permissions.contains("android.permission.ACCESS_BACKGROUND_LOCATION")){
//仅在运行期间允许,这个也是可以去定位的,就是无法使用后台定位,如果要使用后台定位,可以在这里做个提示
}else {
//拒绝授权,给个提示
}
}
@Override
public void onRequestPermissionFailureWithAskNeverAgain(List<String> permissions) {
if (null != permissions && permissions.size()==1 && permissions.contains("android.permission.ACCESS_BACKGROUND_LOCATION")){
//仅在运行期间允许且不再询问
}else {
//拒绝后不在询问,给个弹窗,是否去设置界面
}
}
}, new RxPermissions(this));
以上就是我遇到的问题和思路, 如果有更好的想法和意见,可以一起讨论哦
Android 10 定位权限问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探