gpt4 book ai didi

android - 像谷歌一样跟踪用户位置

转载 作者:行者123 更新时间:2023-11-29 15:12:15 25 4
gpt4 key购买 nike

我正在开发一个必须跟踪用户位置并将其发送到远程服务器的应用程序。我知道这里已经有很多关于此的其他问题,但我无法找到我需要的确切内容。

基本上我使用 FusedLocationProviderApi 来接收位置更新。它非常有用且易于使用。问题是我需要非常频繁地查询位置并且它会很快耗尽电池电量(尽管可能部分电池使用来自网络操作以将位置发送到服务器)。但是,我只需要在用户移动时频繁更新。

所以我正在寻找的是像谷歌那样跟踪 Android 用户的东西(正如我们在 LocationHistory 中看到的那样)。有谁知道谷歌从智能手机获得的位置是否在某处可用?或者也许是实现类似措施的策略?

最佳答案

关于降低电池消耗的建议,您可以使用 Activity 检测来确定您需要多久确定一次位置。这方面我可以推荐https://github.com/mcharmas/Android-ReactiveLocation我贡献了 Activity 检测部分。该库还大大减少了获得融合位置所需的代码行。

该库包含一个简单的用法示例:https://github.com/mcharmas/Android-ReactiveLocation/blob/master/sample/src/main/java/pl/charmas/android/reactivelocation/sample/MainActivity.java

正如您在评论中所写,要找到使用 ActivityDetectionApi 的好示例并不容易。这也是我将其添加到库中的原因之一。事实上,谷歌当时提供的文档已经过时,因为他们更新了 Google Play Services API,但教程没有。

对于不使用该库的教程,我没有任何好的建议,但我可以使用 ReactiveLocation 提供我的代码 fragment 。此代码在服务中运行,因此无论应用是否处于焦点状态,它都会跟踪当前 Activity :

private void requestFilteredActivityUpdates() {

ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(getApplicationContext());
filteredActivitySubscription = locationProvider.getDetectedActivity(0).doOnError(new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
String message = "Error on activitySubscription: " + throwable.getMessage();
Log.e(TAG, message, throwable);
Crashlytics.logException(throwable);
}
}).onErrorReturn(new Func1<Throwable, ActivityRecognitionResult>() {
@Override
public ActivityRecognitionResult call(Throwable throwable) {
List<DetectedActivity> list = new ArrayList<DetectedActivity>();
list.add(new DetectedActivity(DetectedActivity.UNKNOWN, 0));
return new ActivityRecognitionResult(list, System.currentTimeMillis(), SystemClock.elapsedRealtime());
}
}).filter(new Func1<ActivityRecognitionResult, Boolean>() {
@Override
public Boolean call(ActivityRecognitionResult activityRecognitionResult) {

DetectedActivity detectedActivity = activityRecognitionResult.getMostProbableActivity();

boolean highConfidence = detectedActivity.getConfidence() > 75;


DetectedActivity previousActivity = ActivityDetectionModule.Recent.getDetectedActivity();
boolean isNewActivity = detectedActivity.getType() != previousActivity.getType();
boolean hasHigherConfidence = detectedActivity.getConfidence() > previousActivity.getConfidence();


return mJustStarted || (highConfidence && (isNewActivity || hasHigherConfidence));
}
}).subscribe(new Action1<ActivityRecognitionResult>() {
@Override
public void call(ActivityRecognitionResult activityRecognitionResult) {

DetectedActivity detectedActivity = activityRecognitionResult.getMostProbableActivity();

Log.i(TAG, "Activity changed or increased in confidence:");

Log.i(TAG, "New: " + ActivityDetectionModule.getNameFromType(detectedActivity.getType()) + " confidence: " + detectedActivity.getConfidence());

}
});
}

然后在 onDestroy() 中调用

public void unsubscribeActivityUpdates() {
unsubscribe(filteredActivitySubscription);
}

private void unsubscribe(Subscription subscription) {
if (subscription != null && !subscription.isUnsubscribed()) {
Log.i(TAG, "Unsubscribe activity updates");
try {
subscription.unsubscribe();
} catch (Exception e) {
e.printStackTrace();
}
subscription = null;
}
}

我希望这充分说明了如何使用该库,否则请随时提问。

关于android - 像谷歌一样跟踪用户位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29855369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com