我需要在用戶靠近指定位置時通知用戶。我爲此使用Geofencing API。當我測試Android模擬器與模擬位置的應用程序時,一切工作正常。具有模擬位置的真實設備也一樣。但是當我走路並且手機處於深度睡眠模式時,Geofence將在5 - 10分鐘後閃光。如果我位於geofences半徑範圍內,並且我解鎖了手機,請立即打開任何使用位置我的地理圍欄觸發器的應用程序。 (是Android 5.1,Motorolla Moto G的1 - 第一代)當設備處於深度睡眠(休眠)模式時,Geofence正在等待意圖啓動太遲
下面是這樣的,我如何註冊我的地理圍欄:
public void registerLocation(RegisterAlarmRequestModel data) {
if (isLocationDetectionAllowed() && isConnected) {
GeofencingRequest geofencingRequest = prepareGeofencingRequest(prepareGeofence(data));
PendingIntent pendingIntent = prepareIntent(data.getId());
PendingResult<Status> result = GeofencingApi.addGeofences(
googleApiClient, geofencingRequest, pendingIntent);
Status status = result.await();
if (status.isSuccess())
Log.d("Location", "Geofence " + data.getId() + " has been registered");
}
}
//preparing Geofence Pending Intent which will be triggered
private PendingIntent prepareIntent(int alarmId) {
Intent intent = new Intent(context, LocationRingingService.class);
intent.putExtra(LocationRingingService.KEY_ALARM_ID, alarmId);
return PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
private GeofencingRequest prepareGeofencingRequest(Geofence geofence) {
GeofencingRequest.Builder builder = new GeofencingRequest.Builder()
.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER)
.addGeofence(geofence);
return builder.build();
}
private Geofence prepareGeofence(RegisterAlarmRequestModel data) {
Geofence geofence = new Geofence.Builder()
.setRequestId(String.valueOf(data.getId()))
.setCircularRegion(data.getLatitude(), data.getLongitude(), data.getRadius())
.setLoiteringDelay(100)
.setExpirationDuration(Geofence.NEVER_EXPIRE)
.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER)
.build();
return geofence;
}
對於接收意圖我使用IntentService:
@Override
protected void onHandleIntent(Intent intent) {
Log.d("Location", "accepted intent: " + intent.toString());
//database request
}
這我是如何在清單中註冊我的服務的:
<service
android:name=".plugin.delivery.ringing.location.service.LocationRingingService"
android:enabled="true"
android:exported="true" />
更新:我需要抓住用戶剛剛進入geofence的時刻,儘可能準確。我有一個想法:註冊半徑大於需要的地理圍欄(例如,如果需要100米半徑,註冊200-300米半徑的地理圍欄)。當用戶進入更大半徑的Geophence時 - 啓動位置更新服務以提高地理圍欄精度。當用戶剛進入時 - 禁用位置服務。
謝謝你的快速回答!會嘗試它。祝你有美好的一天:) – kolodach
永遠歡迎! :) – Jai
不幸的是,建議並不能解決我的問題:( – kolodach