uni-app 前台服务启动后,前台服务里面调用定位服务或者获取授权信息时报空指针错误
uni-app 前台服务启动后,前台服务里面调用定位服务或者获取授权信息时报空指针错误
操作步骤:
手机APP启动后,可以实现定位数据获取,也能启动前台服务,当手机退出APP的时候,即APP exit的时候,
预期结果:
预期结果是前台服务继续运行,定位功能正常。
实际结果:
实际上是定位功能代码上报空指针。
bug描述:
项目中使用插件 hr-keep-alive,启动前台服务,在启用前台服务的时候设置定时器,定时器内部调用uni.getlocation和uni.getAppAuthorizeSetting(),当手机上APP退出的时候,目前这俩函数都报错空指针。 如下:
21:24:49.694 java.lang.NullPointerException
at uts.sdk.modules.DCloudUniGetAppAuthorizeSetting.IndexKt$getAppAuthorizeSetting$1.invoke(index.kt:39)
at uts.sdk.modules.DCloudUniGetAppAuthorizeSetting.IndexKt$getAppAuthorizeSetting$1.invoke(index.kt:38)
at uts.sdk.modules.hrKeepAlive.IndexKt.getLocationTap(index.kt:218)
at uts.sdk.modules.hrKeepAlive.ForegroundCoreService$onStartCommand$1.invoke(index.kt:78)
at uts.sdk.modules.hrKeepAlive.ForegroundCoreService$onStartCommand$1.invoke(index.kt:77)
at io.dcloud.uts.UTSTimerKt$setInterval$runnableTask$1.invoke(UTSTimer.kt:158)
at io.dcloud.uts.UTSTimerKt$setInterval$runnableTask$1.invoke(UTSTimer.kt:157)
at io.dcloud.uts.UTSTimerKt.setInterval$lambda$3$lambda$2(UTSTimer.kt:164)
at io.dcloud.uts.UTSTimerKt.$r8$lambda$zCuqnEKvpL7ghhy53_Az9Spia6k(Unknown Source:0)
at io.dcloud.uts.UTSTimerKt$$ExternalSyntheticLambda3.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:955)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loopOnce(Looper.java:206)
at android.os.Looper.loop(Looper.java:296)
at android.app.ActivityThread.main(ActivityThread.java:9024)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:569)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:976)
信息项 | 内容 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC开发环境版本号 | windows10 专业版22H2 |
HBuilderX类型 | Alpha |
HBuilderX版本号 | 4.27 |
手机系统 | Android |
手机系统版本号 | Android 12 |
手机厂商 | 荣耀 |
手机机型 | X40I |
页面类型 | nvue |
vue版本 | vue3 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
你好,看到你提到了插件 hr-keep-alive 请不要将这个问题按照Bug提交。你可以尝试在插件市场评论,这样作者可以看到。
针对你提到的在uni-app中前台服务启动后调用定位服务或获取授权信息时报空指针错误的问题,这通常是由于相关服务或对象未被正确初始化或引用导致的。以下是一个简化的代码示例,展示如何在uni-app中安全地调用定位服务和处理授权信息,同时避免空指针错误。
1. 获取定位权限和位置信息
首先,确保你的manifest.json
文件中已经配置了定位权限:
"mp-weixin": {
"requiredPrivateInfos": ["getLocation"]
}
然后,在你的页面中,使用以下代码来获取定位权限和位置信息:
// 引入uni-app的定位模块
const uniLocation = uni.getLocation;
// 检查定位服务是否可用
if (uni.getSystemInfoSync().location) {
uni.authorize({
scope: 'scope.userLocation',
success() {
uniLocation({
type: 'gcj02', // 坐标系类型
success: (res) => {
console.log('定位成功', res.latitude, res.longitude);
},
fail: (err) => {
console.error('定位失败', err);
}
});
},
fail() {
console.warn('用户拒绝授权定位');
}
});
} else {
console.warn('当前环境不支持定位');
}
2. 前台服务启动与定位调用封装
为了确保前台服务中调用定位服务时不会遇到空指针错误,可以将定位逻辑封装成一个函数,并在调用前检查相关依赖是否已正确初始化:
function startForegroundServiceWithLocation() {
// 假设有一个前台服务启动的逻辑
console.log('前台服务已启动');
// 封装好的定位调用函数
function safeGetLocation() {
if (typeof uni.authorize === 'function' && typeof uni.getLocation === 'function') {
// 调用上面定义的获取定位权限和位置信息的代码
// ... (上面的授权和定位代码)
} else {
console.error('定位服务或授权API未正确初始化');
}
}
// 调用封装的定位函数
safeGetLocation();
}
// 假设在某个事件触发时启动前台服务并调用定位
document.addEventListener('DOMContentLoaded', () => {
startForegroundServiceWithLocation();
});
以上代码通过封装定位调用逻辑,并在调用前检查API是否存在,从而避免了因API未初始化而导致的空指针错误。同时,通过检查系统信息来确定定位功能是否可用,进一步增强了代码的健壮性。希望这些代码示例能帮助你解决问题。如果错误依然存在,请检查具体的错误信息和调用栈,以便进一步定位问题。