在启动完成时启动Geofencing

时间:2015-04-14 10:51:17

标签: android google-play-services geofencing

强烈的文字你好,我需要开发un ​​app,当输入位置时收到通知。在android studio“geofencing”的例子中。链接“https://github.com/googlesamples/android-play-location/tree/master/Geofencing” 对我来说工作正常,但我需要应用程序继续启动geofences后启动。我修改了androidManifest.xml,并添加了

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<action android:name="android.intent.action.BOOT_COMPLETED"></action>

然后我创建了一个新的java类,名为BootReceiver.class,代码如下:

ackage com.google.android.gms.location.sample.geofencing;

import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.Geofence;
import com.google.android.gms.location.GeofencingRequest;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.model.LatLng;

import java.util.ArrayList;
import java.util.Map;

/**
 * Created by hal on 14/04/2015.
 */
public abstract class BootReceiver extends BroadcastReceiver implements
        GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback<Status>{
    protected static final String TAG = "creating-and-monitoring-geofences";

    /**
     * Provides the entry point to Google Play services.
     */
    protected GoogleApiClient mGoogleApiClient;

    /**
     * The list of geofences used in this sample.
     */
    protected ArrayList<Geofence> mGeofenceList;

    /**
     * Used to keep track of whether geofences were added.
     */
    private boolean mGeofencesAdded;

    /**
     * Used when requesting to add or remove geofences.
     */
    private PendingIntent mGeofencePendingIntent;

    /**
     * Used to persist application state about whether geofences were added.
     */
    private SharedPreferences mSharedPreferences;

    static final int ONE_MINUTE = 60000;
    Context context;

    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(context)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
        mGoogleApiClient.connect();
    }

    @Override
    public void onReceive(Context context, Intent arg1) {
        mGoogleApiClient.connect();

        this.context = context;
        int resp = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(context);
        if (resp == ConnectionResult.SUCCESS) {


        }
    }

    @Override
    public void onConnectionFailed(ConnectionResult arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onConnected(Bundle arg0) {

        Intent intent = new Intent(context, GeofenceTransitionsIntentService.class);
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling
        // addGeofences() and removeGeofences().
        PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        //Intent intent = new Intent(context, GeofenceTransitionsIntentService.class);

    }

}

但在设备重新启动时始终在应用中收到错误。谁能帮助我?

2 个答案:

答案 0 :(得分:0)

在您的代码中,您没有调用为Google Api客户端创建实例的方法buildGoogleApiClient(),这可能会导致NullPointerException。

答案 1 :(得分:0)

这是一个已经使用过的课程。希望这有帮助。

public class BootReceiver extends BroadcastReceiver implements GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener, LocationListener {

public static final String TAG = "Activity";
private Context mContext;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private List<Geofence> mGeofenceList;
PendingIntent mGeofencePendingIntent;

@Override
public void onReceive(Context context, Intent intent) {
    Log.i(TAG, "Boot intent received.");

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

    mLocationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setInterval(1 * 1000)        // 1 seconds, in milliseconds
            .setFastestInterval(1 * 1000); // 1 second, in milliseconds


    mGoogleApiClient.connect();
    mGeofenceList = new ArrayList<Geofence>();
    mContext = context;
    createGeofences("LalBagh_Garden",12.949, 77.584);


}

@Override
public void onConnected(@Nullable Bundle bundle) {
    Log.i(TAG, "Location services connected in boot.");

    try{
        LocationServices.GeofencingApi.addGeofences(
                mGoogleApiClient,
                getGeofencingRequest(),
                getGeofencePendingIntent()
        ).setResultCallback(new ResultCallback<Status>() {

            @Override
            public void onResult(Status status) {
                if (status.isSuccess()) {
                    Log.i(TAG, "Saving Geofence");

                } else {
                    Log.e(TAG, "Registering geofence failed: " + status.getStatusMessage() +
                            " : " + status.getStatusCode());
                }
            }
        });

    } catch (SecurityException securityException) {
        Log.e(TAG, "Security Error");
    }

}

public void createGeofences(String Gid, double latitude, double longitude) {
    Geofence fence = new Geofence.Builder()
            .setRequestId(Gid)
            .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT)
            .setCircularRegion(latitude, longitude, 350)
            .setExpirationDuration(Geofence.NEVER_EXPIRE)
            .build();
    mGeofenceList.add(fence);
}

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

private PendingIntent getGeofencePendingIntent() {

    if (mGeofencePendingIntent != null) {
        return mGeofencePendingIntent;
    }
    Intent intent = new Intent(this.mContext, GeofenceTransitionsIntentService.class);
    return PendingIntent.getService(this.mContext, 0, intent, PendingIntent.
            FLAG_UPDATE_CURRENT);
}

@Override
public void onConnectionSuspended(int i) {

}

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

}

@Override
public void onLocationChanged(Location location) {

}
}