Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android wear: geofence - ApiException: 1000

I am building an Android app for Android Wear. For battery savings I am trying to use Geofences to track if you enter or exit a location. But I cannot get it working.

First of all I am not sure if Geofences are supported on Android Wear? (Standalone?) I have a Huawei watch 2 LTE which contains a GPS antenne, and I already got the FusedLocationClient working so I know the GPS works. I also got my geofencing code working on the phone with no problems.

When I run the code I get the following exception:

com.google.android.gms.common.api.ApiException: 1000:

I found on the Google API documentation that this means: GEOFENCE_NOT_AVAILABLE which gives me no extra info.

This is the service I wrote to start and create the geofence:

public class GeofencingService extends Service implements OnSuccessListener, OnFailureListener {

    private static final String TAG = "GeofencingService";
    private static final int NOTIFICATION_ID = 1;

    private GeofencingClient mGeofencingClient;
    private List<Geofence> mGeofenceList;
    private NotificationManager mNotificationManager;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        mGeofencingClient = LocationServices.getGeofencingClient(this);
        mGeofenceList = new ArrayList<>();
        createGeofences();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        showNofification();
        setupGeofence();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mNotificationManager.cancel(NOTIFICATION_ID);
    }

    private PendingIntent getGeofencePendingIntent()
    {
        Intent intent = new Intent(this, GeofenceBroadcastReceiver.class);
        return PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }

    private GeofencingRequest getGeofencingRequest() {
        GeofencingRequest.Builder builder = new GeofencingRequest.Builder();

        // The INITIAL_TRIGGER_ENTER flag indicates that geofencing service should trigger a
        // GEOFENCE_TRANSITION_ENTER notification when the geofence is added and if the device
        // is already inside that geofence.
        builder.setInitialTrigger(INITIAL_TRIGGER_ENTER | INITIAL_TRIGGER_EXIT);

        // Add the geofences to be monitored by geofencing service.
        builder.addGeofences(mGeofenceList);

        // Return a GeofencingRequest.
        return builder.build();
    }

    private void setupGeofence()
    {
        try{
            Log.i(TAG, "Setting up geofences...");
            mGeofencingClient.addGeofences(getGeofencingRequest(), getGeofencePendingIntent()).addOnSuccessListener(this).addOnFailureListener(this);
        } catch (SecurityException ex)
        {
            Log.d(TAG, "Exception: " + ex.getMessage());
        }
    }

    private void createGeofences()
    {
        Log.i(TAG, "Creating geofence...");
        mGeofenceList.add(new Geofence.Builder()
                // Set the request ID of the geofence. This is a string to identify this
                // geofence.
                .setRequestId("Test1")
                // Set the circular region of this geofence.
                .setCircularRegion(
                        50.03535,
                        4.33139,
                        100
                )
                .setExpirationDuration(NEVER_EXPIRE)
                // Set the transition types of interest. Alerts are only generated for these
                // transition. We track entry and exit transitions in this sample.
                .setTransitionTypes(GEOFENCE_TRANSITION_ENTER | GEOFENCE_TRANSITION_EXIT)
                // Create the geofence.
                .build());
    }

    private void showNofification()
    {
        Intent appIntent = new Intent(this, MainActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, appIntent, 0);

        Notification notification = new NotificationCompat.Builder(this, NotificationCompat.CATEGORY_SERVICE)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(getText(R.string.location_service_title))
                .setContentText(getText(R.string.location_service_text))
                .setLocalOnly(true)
                .setOngoing(true)
                .setContentIntent(contentIntent)
                .build();

        mNotificationManager.notify(NOTIFICATION_ID, notification);
    }

    @Override
    public void onFailure(@NonNull Exception e) {
        Log.d(TAG, "Exception: " + e.getMessage());
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                setupGeofence();
            }
        }, 2000);
    }

    @Override
    public void onSuccess(Object o) {
        Log.d(TAG, "Success!");
    }
}

Here is also a github link to the example I wrote.

Hopefully somebody can help me figure this out, because I already tried everything I know :)

like image 340
kevingoos Avatar asked Jan 12 '18 08:01

kevingoos


People also ask

How do I test geofencing on my Android?

Test entering a geofence by creating a geofence region that includes your current physical location, so you're already inside the geofence and the “geofence entered” event is triggered immediately. This works great for the entered event but doesn't work for all geofencing scenarios.

How do you stop Geofences?

iOS / AndroidGo to Settings -> Automatic Status Updates -> Geofences to view the list of items to manage.


1 Answers

As you read the documentation and see that the error code is corresponding to GEOFENCE_NOT_AVAILABLE, plus according to @Mr.Rebot comment :

"Not all wear devices have the hardware to support this [...]"

You may assume that GEOFENCE IS NOT AVAILABLE on your Huawei watch 2 device.

You may also ask to Huawei support directly to have confirmation.

like image 130
A STEFANI Avatar answered Nov 04 '22 17:11

A STEFANI