1***@qq.com
1***@qq.com
  • 发布:2026-08-10 08:42
  • 更新:2026-08-10 08:55
  • 阅读:44

使用的4.66版本 真机调试正常,打包后搜索蓝牙一直失败

分类:uni-app

错误内容:startBluetoothDevicesDiscovery:fail Location services are turned off","code":10016
手机上的位置服务一直开着的,权限这些都是给了的

2026-08-10 08:42 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

根据您描述的问题(真机调试正常,但打包后报错 10016 Location services are turned off),结合知识库中的类似案例,这通常是由于打包后权限配置未生效系统定位服务检测异常导致的。以下是排查和解决步骤:

1. 检查蓝牙模块配置(关键)

真机调试时使用的是标准基座(已集成所有模块),但打包时必须手动勾选蓝牙模块,否则权限和原生代码不会被打包进 APK/IPA。

操作路径:

  • 打开 manifest.json → 选择 App模块配置 → 勾选 Bluetooth(蓝牙) 模块
  • 重新云打包/离线打包

2. 确认 Android 权限配置

manifest.jsonApp权限配置 中,确保已添加以下权限(特别是定位权限,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_SCANBLUETOOTH_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 中是否配置了 NSBluetoothAlwaysUsageDescriptionNSBluetoothPeripheralUsageDescription 权限描述

参考链接

如果问题仍未解决,建议提供具体的手机型号和 Android 版本号,以便进一步确认是否为特定机型的系统兼容性问题。

内容为 AI 生成,仅供参考
1***@qq.com

1***@qq.com (作者)

我使用了版本 4.65 及最新版本的5.23 都是如此,安卓版本为14

1***@qq.com

1***@qq.com (作者)

动态权限也是获取了的
const sdkVersion = parseInt(sysInfo.osVersion);
console.log('请求权限3',sysInfo);
let permissionsToRequest = [];

                                if (sdkVersion >= 12) {  
                                    permissionsToRequest = [  
                                        'android.permission.BLUETOOTH_SCAN',  
                                        'android.permission.BLUETOOTH_CONNECT',  
                                        'android.permission.ACCESS_FINE_LOCATION'  
                                    ];  
                                } else if (sdkVersion >= 11) {  
                                    permissionsToRequest = [  
                                        'android.permission.ACCESS_FINE_LOCATION',  
                                        'android.permission.ACCESS_COARSE_LOCATION'  
                                    ];  
                                } else {  
                                log.info('App', 'SDK版本低于11,跳过蓝牙权限请求', 'run');  
                                    resolve(true);  
                                    return;  
                                }  

                                let allGranted = true;  
                                let hasPermanentlyDenied = false;  

                                for (const permission of permissionsToRequest) {  
                                    const result = await permision.requestAndroidPermission(permission);  
                                    console.log('quanxian3',result);  
                                    log.info('App', `权限 ${this.getPermissionName(permission)} 请求结果: ${result}`, 'run');  
                                    if (result === 0) {  
                                        allGranted = false;  
                                    } else if (result === -1) {  
                                        allGranted = false;  
                                        hasPermanentlyDenied = true;  
                                    }  
                                }

要回复问题请先登录注册