NativeScript-Geolocation调用enableLocationRequest在Android10模拟器崩溃求助
我仔细看了你的问题、Manifest配置、代码以及崩溃日志,找到了几个可能导致Android 10(Pixel 3a模拟器)上调用geolocation.enableLocationRequest()崩溃的原因,下面是具体的分析和修复方案:
从你提供的崩溃日志中,关键错误是:
java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
这个错误指向Android 10对Activity主题和屏幕方向的限制,结合你的配置和代码,我们可以从以下几个方向修复:
1. 修复Activity的主题配置问题
Android 10(API 29)禁止非全屏/透明主题的Activity强制设置屏幕方向。你的Manifest中NativeScriptActivity使用了LaunchScreenTheme作为启动主题,同时还通过SET_THEME_ON_LAUNCH的meta-data切换主题,这种配置在调用位置请求时会触发系统异常。
修复操作:
修改AndroidManifest.xml中NativeScriptActivity的配置,直接使用AppTheme作为默认主题,移除多余的主题切换meta-data:
<activity android:name="com.tns.NativeScriptActivity" android:label="@string/title_activity_kimera" android:configChanges="keyboardHidden|orientation|screenSize" android:theme="@style/AppTheme" > <!-- 移除这行多余的meta-data --> <!-- <meta-data android:name="SET_THEME_ON_LAUNCH" android:resource="@style/AppTheme" /> --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
2. 补充Android 10所需的后台位置权限
Android 10及以上版本,若应用需要在后台获取位置信息,除了ACCESS_FINE_LOCATION,还必须申请ACCESS_BACKGROUND_LOCATION权限。你的Manifest中缺少这个权限,而代码中已经开启了iOS的后台位置更新,对应Android也需要补充权限配置。
修复操作:
在Manifest的<uses-permission>区域添加以下权限:
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
3. 修正代码中的上下文错误
你的按钮点击事件代码里,geolocation.enableLocationRequest()的回调中使用了this.watchIds,这里的this指向的是回调函数的上下文,而非Vue组件实例(虽然你定义了that = this,但回调内的this依然错误)。这虽然不是崩溃的直接原因,但会导致后续位置监听逻辑失效,建议一并修正:
try { const that = this; geolocation.isEnabled().then(function (isEnabled) { if (!isEnabled) { geolocation.enableLocationRequest().then(function () { // 用that替代this,确保指向Vue组件实例 that.watchIds.push(geolocation.watchLocation( function (loc) { if (loc) { console.log("Location service: " + loc.timestamp) that.$store.dispatch('usersStore/editUserGeo', {lat: loc.latitude, lng: loc.longitude}) that.locations.push(loc); } }, function (e) { console.log("Error: " + e.message); }, { iosAllowsBackgroundLocationUpdates: true, desiredAccuracy: Accuracy.high, // 补充Android后台位置更新配置 androidAllowBackgroundLocationUpdates: true })); }, function (e) { console.log("Error: " + (e.message || e)); }); } }, function (e) { console.log("Error: " + (e.message || e)); }); } catch (ex) { console.log("Error: " + ex.message); }
4. 模拟器环境排查
Android模拟器偶尔会出现位置服务异常,建议你:
- 打开模拟器系统设置,确认位置服务已开启
- 在模拟器的「Extended Controls」面板中,模拟一个具体的经纬度坐标,再测试位置请求功能
完成以上修改后,执行以下操作确保生效:
- 清理NativeScript项目构建缓存:
tns clean - 重新构建并运行Android应用:
tns run android - 点击按钮触发位置请求,验证是否崩溃
内容的提问来源于stack exchange,提问作者butaminas

