BroadcastReceiver not receiving any activity recognition broadcast

1.3k Views Asked by At

My main activity registering broadcast for Activity Recognition but and don't see any calls to Broadcast Receiver's onReceive method. I am not able to figure out why it's not working as expected.

I am testing on Real device with android 11 (API 30) with all required permission

Main Activity Register Broadcast

List<ActivityTransition> transitions = new ArrayList<>();
        PendingIntent activityPendingIntent;


        // Action fired when transitions are triggered.
        final String TRANSITIONS_RECEIVER_ACTION = "com.example.TRANSITIONS_RECEIVER_ACTION";

        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());


        ActivityTransitionRequest request = new ActivityTransitionRequest(transitions);
        Intent mintent = new Intent(this, ActivityRecognitionBroadcastReceiver.class);
        mintent.setAction(TRANSITIONS_RECEIVER_ACTION);

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

        Task<Void> task = ActivityRecognition.getClient(this)
                .requestActivityTransitionUpdates(request, activityPendingIntent);


        task.addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(@NonNull Void command) {
                checkFirstimeActivityRecognition = false;
                Log.i(TAG, "Successfully added transition updates listener");
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.e(TAG,"Transitions could not be unregistered: " + e);
            }
        });
        ActivityRecognitionBroadcastReceiver broadcastReceiver = new ActivityRecognitionBroadcastReceiver();
        registerReceiver(broadcastReceiver, new IntentFilter(TRANSITIONS_RECEIVER_ACTION));
        Log.d(TAG, "setupActivityRecognition: Register Broadcast receiver ");

BroadcastReceiver

public class ActivityRecognitionBroadcastReceiver extends BroadcastReceiver {
    public static final String TAG = "Broadcast Recognition";
    
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "On Handle Intent");
        Log.d(TAG, "onReceive(): " + intent);
        Toast.makeText(MyApplication.getmContext(), intent.getAction(), Toast.LENGTH_SHORT).show();
       
    }

Manifest

<application ...

<receiver
            android:name=".Location_system.ActivityRecognitionBroadcastReceiver"
            android:permission="com.google.android.gms.permission.ACTIVITY_RECOGNITION">
            <intent-filter>
                <action android:name="com.example.TRANSITIONS_RECEIVER_ACTION"/>
            </intent-filter>
        </receiver>

</application>
1

There are 1 best solutions below

0
Sean Barbeau On

At some point it seems that the following intent for an explicit class stopped working (or maybe never worked?):

Intent mintent = new Intent(this, ActivityRecognitionBroadcastReceiver.class);

Instead, I created the intent by passing in the action in the intent constructor, as follows:

Intent mintent = new Intent(TRANSITIONS_RECEIVER_ACTION);

...and then I started to get callbacks successfully from the Activity Transition API.

Note that this approach is used in the latest codelab as well: https://github.com/googlecodelabs/activity_transitionapi-codelab/blob/master/complete/src/main/java/com/google/example/android/basicactivityrecognitiontransitionsample/MainActivity.java#L134