php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 434|回复: 0

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

[复制链接]

3142

主题

3152

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7956
贡献
0
注册时间
2021-4-14
最后登录
2024-11-22
在线时间
763 小时
QQ
发表于 2022-8-17 10:22:47 | 显示全部楼层 |阅读模式
为了保护用户隐私,大多数应用只会在前台运行时获取用户位置,当应用在后台运行时,定位功能会被禁止。这就导致APP在后台或者锁屏时无法正常记录GPS轨迹,这对打车、共享出行、跑步等需要实时记录用户轨迹的应用影响非常大,甚至影响了应用核心功能的使用体验。那对于这些应用的开发者来说,如何在用户主动授权位置信息后,让应用在后台运行时长时间保持持续定位呢?

HMS Core定位服务提供后台持续定位的能力,在获取用户主动授权的情况下可持久记录位置信息,适用于记轨迹录场景。

一、融合定位-后台定位实现方法
应用运行设备为非华为手机

使用LocationCallback开启定位之后,当应用切到后台之后,定位将会很快停止。

为了让应用切到后台之后,定位能力依旧有效,所以可以使用enableBackgroundLocation方法创建一个前台服务,用以提高应用在后台的位置更新频率。

后台定位本身不具备定位能力,后台定位需要和LocationCallback开启的定位一起使用。定位获取的数据需要在 LocationCallback对象中的onLocationResult(LocationResult locationResult) 方法中获取。

二、注意事项:
支持的设备为非华为手机

应用需要获得定位权限,且必须为“始终允许”

应用不可被设备中的省电精灵等控电应用冻结,以vivo手机为例:打开i管家-后台耗电管理-找到应用-把智能控电改成允许后台高耗电。

三、测试Demo时的注意事项:
测试时设备最好不要是充电状态,充电状态下应用可能不会被控电。

可以通过状态栏是否有 定位图表判断 设备当前是否在进行定位。以vivo手机为例:vivo手机定位开启时状态栏会展示一个定位图标,如果不开启后台定位的话应用切后台 定位图标会消失。开启后台定位能力之后,应用切后台定位图标还是存在的。

四、实现后台定位功能集成步骤
在AndroidManifest.xml中添加后台定位服务
<service
    android:name="com.huawei.location.service.BackGroundService"
    android:foregroundServiceType="location" />

(可选)在Android 9及以上版本中,为保证后台定位权限的正常使用,需要在“AndroidManifest.xml”文件中配置FOREGROUND_SERVICE权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

创建Notification对象
public class NotificationUtil {
    public static final int NOTIFICATION_ID = 1;

    public static Notification getNotification(Context context) {
        Notification.Builder builder;
        Notification notification;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationManager notificationManager =
                (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
            String channelId = context.getPackageName();
            NotificationChannel notificationChannel =
                new NotificationChannel(channelId, "LOCATION", NotificationManager.IMPORTANCE_LOW);
            notificationManager.createNotificationChannel(notificationChannel);
            builder = new Notification.Builder(context, channelId);
        } else {
            builder = new Notification.Builder(context);
        }
        builder.setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle("Location SDK")
            .setContentText("Running in the background ")
            .setWhen(System.currentTimeMillis());
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            notification = builder.build();
        } else {
            notification = builder.getNotification();
        }
        return notification;
    }
}
初始化FusedLocationProviderClient对象
FusedLocationProviderClient mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);

开启后台定位
private void enableBackgroundLocation() {
    mFusedLocationProviderClient
            .enableBackgroundLocation(NotificationUtil.NOTIFICATION_ID, NotificationUtil.getNotification(this))
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    LocationLog.i(TAG, "enableBackgroundLocation onSuccess");
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(Exception e) {
                    LocationLog.e(TAG, "enableBackgroundLocation onFailure:" + e.getMessage());
                }
            });
}





上一篇:JPEG公布智能图像编码提案结果,火山引擎排名主观质量评...
下一篇:教你如何发布有效高质量外链,随时更新名单
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-22 20:11 , Processed in 0.987163 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表