NS8安卓Target SDK30无法识别ACCESS_BACKGROUND_LOCATION权限如何解决
问题解决方案
1. 权限无法识别的问题修复
ACCESS_BACKGROUND_LOCATION是Android 10(API 29)才新增的权限,无法识别通常是两种原因,对应解决方法如下:
- 编译时类型报错:NativeScript的Android类型定义未覆盖该权限,可以直接用字符串常量
"android.permission.ACCESS_BACKGROUND_LOCATION"代替android.Manifest.permission.ACCESS_BACKGROUND_LOCATION,如果还有TS报错可以加// @ts-ignore临时忽略,运行时不会受影响;也可以自行扩展android全局对象的类型定义补全该属性。 - 运行时报错找不到该值:确认你的项目编译SDK版本不低于29,打开
App_Resources/Android/app.gradle修改配置:
android { compileSdkVersion 30 defaultConfig { targetSdkVersion 30 } }
2. 后台权限弹窗弹不出来的注意事项
Android 11(API 30)对后台位置权限的申请流程有严格限制,必须遵循以下流程才能触发系统弹窗:
- 必须先申请
ACCESS_FINE_LOCATION前台位置权限,拿到用户授权之后才能申请后台位置权限,不能同时申请两个权限,否则系统会直接拒绝申请,不会弹出选择框。 - 申请逻辑触发后,系统弹窗会出现「始终允许」选项,就是你合规演示需要的后台权限申请弹窗。
3. 修正后的参考代码
import { AndroidActivityRequestPermissionsEventData, AndroidApplication, android as andApp } from '@nativescript/core/application'; // 先确认前台位置权限已经拿到(可以用nativescript-community/ble已经实现的申请逻辑先拿到前台权限) if (androidx.core.content.ContextCompat.checkSelfPermission( andApp.foregroundActivity, android.Manifest.permission.ACCESS_FINE_LOCATION ) === android.content.pm.PackageManager.PERMISSION_GRANTED) { const neededPermission = "android.permission.ACCESS_BACKGROUND_LOCATION"; const activity = andApp.foregroundActivity || andApp.startActivity; const permissionCb = (args: AndroidActivityRequestPermissionsEventData) => { if (args.requestCode === 1001) { const isGranted = args.grantResults[0] === android.content.pm.PackageManager.PERMISSION_GRANTED; console.log('后台位置权限申请结果:', isGranted); // 用完移除事件监听,避免内存泄漏 andApp.off(AndroidApplication.activityRequestPermissionsEvent, permissionCb); } }; andApp.on(AndroidApplication.activityRequestPermissionsEvent, permissionCb); androidx.core.app.ActivityCompat.requestPermissions(activity, [neededPermission], 1001); }
4. 谷歌Play后台配置补充
应用内逻辑调整完成后,还需要前往Play Console的「敏感应用权限」板块,找到后台位置权限的声明入口,提交你的应用使用该权限的场景说明,同时上传你录制的权限申请演示视频,即可解决上传时的权限未声明警告。
内容的提问来源于stack exchange,提问作者Jose Chavez
相关产品推荐
相关产品推荐

