為了保護用戶隱私,大多數應用只會在前臺運行時獲取用戶位置,當應用在後臺運行時,定位功能會被禁止。這就導致APP在後臺或者鎖屏時無法正常記錄GPS軌跡,這對打車、共用出行、跑步等需要實時記錄用戶軌跡的應用影響非常大,甚至影響了應用核心功能的使用體驗。那對於這些應用的開發者來說,如何在用戶主動授權位置信 ...
為了保護用戶隱私,大多數應用只會在前臺運行時獲取用戶位置,當應用在後臺運行時,定位功能會被禁止。這就導致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());
}
});
}
瞭解更多詳情>>
訪問華為開發者聯盟官網
獲取開髮指導文檔
華為移動服務開源倉庫地址:GitHub、Gitee
關註我們,第一時間瞭解 HMS Core 最新技術資訊~