You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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」面板中,模拟一个具体的经纬度坐标,再测试位置请求功能
验证步骤

完成以上修改后,执行以下操作确保生效:

  1. 清理NativeScript项目构建缓存:tns clean
  2. 重新构建并运行Android应用:tns run android
  3. 点击按钮触发位置请求,验证是否崩溃

内容的提问来源于stack exchange,提问作者butaminas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:14:18