Предложение по снижению потребления батареи, вы можете использовать обнаружение активности, чтобы определить, как часто вам нужно определять положение. В связи с этим могу порекомендовать https://github.com/mcharmas/Android-ReactiveLocation, к которому Я внес свой вклад в часть обнаружения активности. Библиотека также значительно сокращает количество строк кода, необходимых для получения объединенных локаций.
Библиотека включает простой пример использования здесь: https://github.com/mcharmas/Android-ReactiveLocation/blob/master/sample/src/main/java/pl/charmas/android/reactivelocation/sample/MainActivity.java
Как вы написали в комментарии, найти хорошие примеры использования ActivityDetectionApi непросто. Это также было одной из причин, почему я добавил его в библиотеку. На самом деле документация, которая была доступна в то время в Google, устарела, поскольку они обновили API сервисов Google Play, но не учебные пособия.
У меня нет хороших указателей на учебники, не использующие библиотеку, но я могу предоставить фрагмент своего кода с помощью ReactiveLocation. Этот код работает в службе, поэтому он отслеживает текущую активность независимо от того, находится приложение в фокусе или нет:
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;
}
}
Я надеюсь, что это достаточно хорошо иллюстрирует, как использовать библиотеку, в противном случае не стесняйтесь спрашивать.
person
cYrixmorten
schedule
24.04.2015