欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
根据您描述的问题(真机调试正常,但打包后报错 10016 Location services are turned off),结合知识库中的类似案例,这通常是由于打包后权限配置未生效或系统定位服务检测异常导致的。以下是排查和解决步骤:
1. 检查蓝牙模块配置(关键)
真机调试时使用的是标准基座(已集成所有模块),但打包时必须手动勾选蓝牙模块,否则权限和原生代码不会被打包进 APK/IPA。
操作路径:
- 打开
manifest.json → 选择 App模块配置 → 勾选 Bluetooth(蓝牙) 模块
- 重新云打包/离线打包
2. 确认 Android 权限配置
在 manifest.json 的 App权限配置 中,确保已添加以下权限(特别是定位权限,Android 6.0+ 搜索蓝牙必须依赖定位权限):
"permissions": [
"android.permission.ACCESS_FINE_LOCATION",
"android.permission.ACCESS_COARSE_LOCATION",
"android.permission.BLUETOOTH",
"android.permission.BLUETOOTH_ADMIN",
"android.permission.BLUETOOTH_SCAN",
"android.permission.BLUETOOTH_CONNECT"
]
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
注意: Android 12+ 还需要在代码中动态申请 BLUETOOTH_SCAN 和 BLUETOOTH_CONNECT 权限。
3. 代码中增加定位服务检测(推荐)
部分机型(尤其是 Android 10+)即使开启了定位,系统也可能返回未开启状态。建议在调用 startBluetoothDevicesDiscovery 前,先检测并引导用户开启定位:
// #ifdef APP-PLUS
function checkLocationService() {
return new Promise((resolve) => {
const context = plus.android.importClass('android.content.Context');
const locationManager = plus.android.importClass('android.location.LocationManager');
const main = plus.android.runtimeMainActivity();
const mainSvr = main.getSystemService(context.LOCATION_SERVICE);
if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
uni.showModal({
title: '提示',
content: '搜索蓝牙设备需要开启定位服务',
confirmText: '去开启',
success: (res) => {
if (res.confirm) {
const Intent = plus.android.importClass('android.content.Intent');
const Settings = plus.android.importClass('android.provider.Settings');
const intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
main.startActivity(intent);
}
resolve(false);
}
});
} else {
resolve(true);
}
});
}
// 使用方式
async function startDiscovery() {
const isLocationOn = await checkLocationService();
if (!isLocationOn) return;
uni.startBluetoothDevicesDiscovery({
success(res) {
console.log('搜索成功', res);
},
fail(err) {
console.error('搜索失败', err);
}
});
}
// #endif
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
4. 版本回退(临时方案)
根据知识库反馈,HBuilderX 4.66 版本存在部分机型兼容性问题(Android 10-14 均有报告)。如果上述方法无效,可尝试:
- 回退到 4.65 版本:多位用户反馈回退后问题解决(但可能出现搜索不到设备的新问题,需测试)
- 升级到最新 Alpha 版:检查是否已修复该问题
5. 其他排查点
- 卸载重装应用:权限声明后需要完全卸载旧版本再安装,否则权限缓存可能导致异常
- 检查手机设置:确保手机「设置」→「位置信息」中已开启定位(不仅是应用权限,系统总开关也要开)
- iOS 特殊处理:如果是 iOS 打包后出现问题,检查
manifest.json 中是否配置了 NSBluetoothAlwaysUsageDescription 和 NSBluetoothPeripheralUsageDescription 权限描述
参考链接
如果问题仍未解决,建议提供具体的手机型号和 Android 版本号,以便进一步确认是否为特定机型的系统兼容性问题。
3 个回复
Ask小助手
根据您描述的问题(真机调试正常,但打包后报错
10016 Location services are turned off),结合知识库中的类似案例,这通常是由于打包后权限配置未生效或系统定位服务检测异常导致的。以下是排查和解决步骤:1. 检查蓝牙模块配置(关键)
真机调试时使用的是标准基座(已集成所有模块),但打包时必须手动勾选蓝牙模块,否则权限和原生代码不会被打包进 APK/IPA。
操作路径:
manifest.json→ 选择 App模块配置 → 勾选 Bluetooth(蓝牙) 模块2. 确认 Android 权限配置
在
manifest.json的 App权限配置 中,确保已添加以下权限(特别是定位权限,Android 6.0+ 搜索蓝牙必须依赖定位权限):注意: Android 12+ 还需要在代码中动态申请
BLUETOOTH_SCAN和BLUETOOTH_CONNECT权限。3. 代码中增加定位服务检测(推荐)
部分机型(尤其是 Android 10+)即使开启了定位,系统也可能返回未开启状态。建议在调用
startBluetoothDevicesDiscovery前,先检测并引导用户开启定位:4. 版本回退(临时方案)
根据知识库反馈,HBuilderX 4.66 版本存在部分机型兼容性问题(Android 10-14 均有报告)。如果上述方法无效,可尝试:
5. 其他排查点
manifest.json中是否配置了NSBluetoothAlwaysUsageDescription和NSBluetoothPeripheralUsageDescription权限描述参考链接
如果问题仍未解决,建议提供具体的手机型号和 Android 版本号,以便进一步确认是否为特定机型的系统兼容性问题。
1***@qq.com (作者)
我使用了版本 4.65 及最新版本的5.23 都是如此,安卓版本为14
1***@qq.com (作者)
动态权限也是获取了的
const sdkVersion = parseInt(sysInfo.osVersion);
console.log('请求权限3',sysInfo);
let permissionsToRequest = [];
要回复问题请先登录或注册
公告
更多>相关问题