1

I am trying to track the users activities with a Service + BroadCastReceiver.

ActivityTrackingService.java

public class ActivityTrackingService extends Service {

private static final String TAG = "ActivityTracking";

public static ActivityTrackingService instance;

public static boolean isStarted() {
    return instance != null;
}

public ActivityTrackingService() {
    super();
}

@Override
public void onCreate() {
    Log.d(TAG, "onCreate onCreate!");
    super.onCreate();

    instance = this;
}

@Override
public void onDestroy() {
    Log.d(TAG, "Updates stopped!");
    ActivityRecognition.getClient(this).removeActivityTransitionUpdates(activityPendingIntent);
    super.onDestroy();
}

private static List<ActivityTransition> transitions = new ArrayList<>();
private static PendingIntent activityPendingIntent;
private static ActivityTransitionRequest transitionRequest;

void initActivityTransition(){
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.IN_VEHICLE)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
                    .build());
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.IN_VEHICLE)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
                    .build());
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.WALKING)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
                    .build());
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.WALKING)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
                    .build());
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.STILL)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
                    .build());
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.STILL)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
                    .build());

    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.ON_BICYCLE)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)

                    .build());
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.ON_BICYCLE)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
                    .build());

    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.RUNNING)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
                    .build());

    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.RUNNING)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
                    .build());


    Log.d(TAG,"initActivityTransition " + transitions.size());
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    initActivityTransition();
    ActivityTransitionRequest request = new ActivityTransitionRequest(transitions);
    Intent mintent = new Intent(this, ActivityTransitionBroadcastReceiver.class);
    mintent.setAction(ActivityTransitionBroadcastReceiver.INTENT_ACTION);

    activityPendingIntent = PendingIntent.getBroadcast(this, 0, mintent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    Task<Void> task = ActivityRecognition.getClient(this)
            .requestActivityTransitionUpdates(request, activityPendingIntent);
    task.addOnSuccessListener(command -> Log.i(TAG, "Successfully added transition updates listener"));
    return START_STICKY;
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

}

ActivityTransitionBroadcastReceiver.java

public class ActivityTransitionBroadcastReceiver extends BroadcastReceiver {

public static final String INTENT_ACTION = "package.ACTION_PROCESS_ACTIVITY_TRANSITIONS";
private static final String TAG = "ActivityTracking";

@Override
public void onReceive(Context context, Intent intent) {
    if (intent != null && INTENT_ACTION.equals(intent.getAction())) {
        if (ActivityTransitionResult.hasResult(intent)) {
            ActivityTransitionResult intentResult = ActivityTransitionResult
                    .extractResult(intent);
            Log.i(TAG, "RECEIVED BROADCAST!");
        }
    }
}

}

AndroidManifest.xml

    <service android:name=".service.services.ActivityTrackingService"></service>
    <receiver android:name=".service.services.ActivityTransitionBroadcastReceiver"
        android:exported="false"
        android:permission="com.google.android.gms.permission.ACTIVITY_RECOGNITION">
        <intent-filter>
            <action android:name="package.ACTION_PROCESS_ACTIVITY_TRANSITIONS" />
        </intent-filter>
    </receiver>

Log ouput:

2020-02-26 16:38:06.503 29363-29363/package D/ActivityTracking: onCreate onCreate!
2020-02-26 16:38:06.510 29363-29363/package D/ActivityTracking: initActivityTransition 10
2020-02-26 16:38:07.014 29363-29363/package I/ActivityTracking: Successfully added transition updates listener

The Service itself is started and the SuccessListener of the ActivityRecognitionClient Task is executed properly (see log output). However, the BroadcastReceiver never receives anything. Any suggestions?

DrEichenbach
  • 382
  • 1
  • 2
  • 13

0 Answers0