1

在供應商改變了我的地理圍欄停止工作,否則一切工作正常。 這裏是我的廣播接收器的代碼,我嘗試重新註冊我的地理圍欄。如何在供應商重新註冊的Android地理圍欄改變?

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

public class LocationProviderChangedReceiver extends BroadcastReceiver implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener,ResultCallback<Status> { 
    int i=0; 
    protected GoogleApiClient mGoogleApiClient; 
    Geofence geofence; 
    Context context; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     i=i++; 
     this.context=context; 
     Toast.makeText(context,"Provider changed ,Geofencing restarted.",Toast.LENGTH_LONG).show(); 
     Log.wtf("senpai","oooooo"+i); 
     LatLng latLng=new LatLng(28.5795613,77.3136267); 

     geofence=new Geofence.Builder() 
       .setRequestId("x").setCircularRegion(latLng.latitude,latLng.longitude, Constants.GEOFENCE_RADIUS_IN_METERS) 
       .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS) 
       .setLoiteringDelay(500) 
       .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT|Geofence.GEOFENCE_TRANSITION_DWELL) 
       .build(); 

     mGoogleApiClient = new GoogleApiClient.Builder(context) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 

    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     try { 
      LocationServices.GeofencingApi.removeGeofences(mGoogleApiClient, getGeofencePendingIntent()).setResultCallback(this); // Result processed in onResult(). 
      LocationServices.GeofencingApi.addGeofences(mGoogleApiClient, getGeofencingRequest(), getGeofencePendingIntent()).setResultCallback(this); // Result processed in onResult(). 
     } catch (SecurityException securityException) { 
      // Catch exception generated if the app does not use ACCESS_FINE_LOCATION permission. 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 

    @Override 
    public void onResult(@NonNull Status status) { 

    } 

    private PendingIntent getGeofencePendingIntent() { 
     Intent intent = new Intent("ACTION_RECEIVE_GEOFENCE"); 
     // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling addgeoFences() 
     return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    } 

    private GeofencingRequest getGeofencingRequest() { 
     GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); 
     builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); 
     builder.addGeofence(geofence); 
     return builder.build(); 
    } 
} 

在我的活動中,我也做了同樣的事情。我如何重新啓動我的地理圍欄?

回答

0

爲了使您的地理圍欄運行,則必須在(一)位置提供變化重新註冊的地理圍欄也(B)重啓設備:

下面是一些片段從我的工作Geofencer例子,測試谷歌播放區域範圍設定,並將其與另一個庫:

註冊清單中的廣播接收器的兩個事件:

<!-- Listen for the device starting up for re-registration tasks --> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
... 
    <receiver 
     android:name=".geo.GeoRestartReceiver" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter> 
      <category android:name="android.intent.category.DEFAULT" /> 

      <action android:name="android.intent.action.BOOT_COMPLETED" /> <!-- android.intent.action.LOCKED_BOOT_COMPLETED would be triggered earlier, in case we don't need access to credential secure storage --> 
      <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 
      <action android:name="com.htc.intent.action.QUICKBOOT_POWERON" /> 
      <action android:name="android.location.PROVIDERS_CHANGED" /> 
     </intent-filter> 
    </receiver> 

創建一個接收器(重新)開始你的地理圍欄(由重創建地理圍欄請求:

public class GeoRestartReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (!GeoLocationUtil.isGpsEnabled(context) || !GeoLocationUtil.hasGpsPermissions(context)) 
      return; 

     GeofenceSettings settings = new GeofenceSettings(context); 
     if (!settings.isGeofencingActive()) { 
      return; 
     } 

     GeofenceProvider geofenceProvider = new PlayGeofenceProvider(context); 
     geofenceProvider.start(homeLocation, enterRadius, exitRadius, 
      initTrigger, usePolling); 
    } 
} 

大多數Google Geofencing API邏輯封裝在我的自定義類中。只需查看Geofencer回購看到更多細節。