当前位置: 首页 > 后端技术 > Java

App切换到后台后如何保持持续定位?

时间:2023-04-01 14:16:33 Java

为了保护用户隐私,大部分应用程序只有在前台运行时才会获取用户的位置信息。当应用程序在后台运行时,定位功能将被禁用。导致APP在后台或锁屏时无法正常记录GPS轨迹。这对打车、共享出行、跑步等需要实时记录用户轨迹的应用影响很大,甚至影响应用核心功能的用户体验。对于这些应用的开发者来说,在用户主动授权位置信息后,应用在后台运行时,如何长时间保持位置?HMSCore定位服务提供后台持续定位能力,在用户主动授权的情况下可以永久记录位置信息,适用于轨迹记录场景。1.融合定位-后台定位实现方法应用运行设备使用LocationCallback为非华为手机开启定位后,当应用切换到后台时,定位很快停止。为了让应用切换到后台后定位能力仍然有效,可以使用enableBackgroundLocation方法创建一个前台服务,以增加应用在后台的位置更新频率。后台定位本身不具备定位能力,需要后台定位与LocationCallback开启的定位配合使用。location获取的数据需要在LocationCallback对象的onLocationResult(LocationResultlocationResult)方法中获取。2.注意事项:支持的设备为非华为手机。应用需要获取定位权限,并且必须是“一直允许”。应用程序不能被设备中的省电向导等省电应用程序冻结。以vivo手机为例:打开i管家-后台耗电管理-找到应用-更改智能电量控制允许后台高耗电。3、测试Demo时的注意事项:测试过程中最好不要给设备充电,充电状态下应用可能无法充电。您可以通过查看状态栏中是否有定位图表来判断设备当前是否正在定位。以vivo手机为例:开启vivo手机定位后,状态栏会显示一个定位图标。如果没有启用后台定位,应用会切换到后台,定位图标会消失。开启后台定位能力后,应用的后台定位图标依然存在。4.实现后台定位功能集成的步骤在AndroidManifest.xml中添加后台定位服务(可选)在Android9中及以上版本,为保证后台位置权限的正常使用,需要在“AndroidManifest.xml”文件中配置FOREGROUND_SERVICE权限:创建通知对象publicclassNotificationUtil{publicstaticfinalintNOTIFICATION_ID=1;publicstaticNotificationgetNotification(Contextcontext){Notification.Builder构建器;通知通知;如果(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){NotificationManagernotificationManager=(NotificationManager)上下文。getSystemService(NOTIFICATION_SERVICE);StringchannelId=context.getPackageName();NotificationChannelnotificationChannel=newNotificationChannel(channelId,"LOCATION",NotificationManager.IMPORTANCE_LOW);notificationManager.createNotificationChannel(notificationChannel);builder=newNotification.Builder(context,channelId);}else{builder=newNotification.Builder(context);}builder.setSmallIcon(R.drawable.ic_launcher).setContentTitle("LocationSDK").setContentText("后台运行").setWhen(System.currentTimeMillis());if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN){notification=builder.build();}else{notification=builder.getNotification();}returnnotification;}}初始化FusedLocationProviderClient对象FusedLocationProviderClientmFusedLocationProviderClient=LocationServices.getFusedLocationProviderClient(this);开始后定位privatevoidenableBackgroundLocation(){mFusedLocationProviderClient.enableBackgroundLocation(NotificationUtil.NOTIFICATION_ID,NotificationUtil.getNotification(this)).addOnFailureListener(newOnFailureListener(){@OverridepublicvoidonFailure(Exceptione){LocationLog.e(TAG,"enableBackgroundLocationonFailure:"+e.getMessage());}});}更多详情>>访问华为获取开发者联盟官网开发指导文档。华为移动服务开源仓库地址:GitHub和Gitee。关注我们,了解HMSCore的最新技术资讯~