常见问题

最后更新时间:2025-03-14

Q: 为什么在导航过程中把App退到后台,导航的轨迹不准确?

A: 根据Android系统的策略,如果需要在后台能正常的导航,App需要额外的策略来保持App页面在后台也能及时获得准确的定位更新。

从Android 10开始,必须在Manifest里声明ACCESS_BACKGROUND_LOCATION权限,以便App能在后台运行时访问位置信息。

<manifest ... >
  <!-- Required only when requesting background location access on
       Android 10 (API level 29) and higher. -->
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>

从Android 8开始,后台应用在有后台定位的权限下,也只能获得每小时几次的定位信息更新,要解除这一限制,需要将Activity保持在前台运行。
或者显示的启动一个前台服务,声明location的前台服务类型,并调用 startForegroundService() 启动应用中某个location类型的前台服务。此前台服务处于活动状态后,会以通知的形式持续显示在通知区域。

<service
    android:name="MyNavigationService"
    android:foregroundServiceType="location" ... >
    <!-- Any inner elements would go here. -->
</service>

详细的Android位置信息系统策略可参考Google的官方文档


Q: 为什么在导航过程中把手机锁屏,导航的轨迹不准确?

A. 由于Android系统的电池策略,手机在锁屏后,如果没有活跃的应用,手机可能进入休眠模式,这可能导致应用获取不到GPS定位点或所有定位点。

如果你希望你的导航应用在导航过程中不自动锁屏,你可以使用FLAG_KEEP_SCREEN_ON,或为布局添加android:keepScreenOn节点。

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

向用户倡议不要在需要频繁更新定位的场景下(比如导航)锁定屏幕电源。

如果业务需要,可以将你的应用申请加入后台运行白名单,并引导用户允许并开启。

关于Android系统电池优化设置相关可参考

本页内容