Activity Recognition Transitions API issue

137 Views Asked by At

I'm developing a mobility monitoring system for educational purposes and so I decided to use the Android API Activity Transitions to recognize activities such as IN_VEHICLE or ON_BICYCLING.

I followed the implementation given by android in the documentation right here: https://developer.android.com/guide/topics/location/transitions

This is my ActivityRecognitionService.java:


public class ActivityRecognitionService extends Service {

    private ActivityTransitionRequest request;
    private ActivityTransitionsReceiver transitionsReceiver;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        List<ActivityTransition> transitions = new ArrayList<>();
        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_FOOT)
                        .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
                        .build());

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

        request = new ActivityTransitionRequest(transitions);

        transitionsReceiver = new ActivityTransitionsReceiver();

        LocalBroadcastManager.getInstance(this).registerReceiver(transitionsReceiver, new IntentFilter("PROVA"));

        startForeground(NOTIFICATION_ID, createNotification());
        new Thread(this::startActivityRecognition).start();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopAll();
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);
        stopAll();
    }

    /* Start activity recognition */
    @SuppressLint("MissingPermission")
    private void startActivityRecognition() {
        Task<Void> task = ActivityRecognition.getClient(this)
                .requestActivityTransitionUpdates(request, getActivityRecognitionPendingIntent());

        task.addOnSuccessListener(
                result -> Log.i("SERVICE AR", "Start activity recognition!")
        );

        task.addOnFailureListener(
                e -> Log.i("SERVICE AR", "Start activity recognition failed!")
        );
    }

    /* Stop l'activity recognition */
    @SuppressLint("MissingPermission")
    private void stopActivityRecognition() {

        PendingIntent intent = getActivityRecognitionPendingIntent();

        Task<Void> task = ActivityRecognition.getClient(this)
                .removeActivityTransitionUpdates(intent);

        task.addOnSuccessListener(
                result -> {
                    intent.cancel();
                    Log.e("SERVICE AR", "Stop activity recognition!");
                }
        );

        task.addOnFailureListener(
                e -> Log.e("SERVICE AR", "Stop activity recognition failed!")
        );
    }

    private PendingIntent getActivityRecognitionPendingIntent() {
        Intent intent = new Intent("PROVA");
        return PendingIntent.getBroadcast(ActivityRecognitionService.this, 0, intent, PendingIntent.FLAG_MUTABLE);
    }

    public static class ActivityTransitionsReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i("RECEIVED", "RECEIVED!"); 
        }
    }
}

The activity recognition starts successfully as I also get the "Start activity recognition" log which confirms the correct start. After that, the flow enters the getActivityRecognitionPendingIntent() function and from there it gets blocked, I don't get anything inside the receiver's onReceive().

What am I doing wrong?

Finally, I also leave my manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unibo.mobilitytrackingsystem">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
    <application
        android:allowBackup="true"
        android:animateLayoutChanges="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MobilityTrackingSystem"
        android:usesCleartextTraffic="true"
        >
        <meta-data
            android:name="com.google.android.gms.location.base"
            android:value="com.unibo.mobilitytrackingsystem.ARServices.ActivityRecognitionService" />

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="AIzaSyC4RCfGvTFnTG4ePRvdmyiOi2G84vnW2o0"/>

        <activity
            android:name="com.unibo.mobilitytrackingsystem.AuthActivity"
            android:exported="true"
            android:theme="@style/Theme.MobilityTrackingSystem"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <activity
            android:name="com.unibo.mobilitytrackingsystem.HomeActivity"
            android:exported="false"
            android:theme="@style/Theme.MobilityTrackingSystem"
            android:screenOrientation="portrait"
            />

        <activity
            android:name="com.unibo.mobilitytrackingsystem.SettingsActivity"
            android:exported="false"
            android:theme="@style/Theme.MobilityTrackingSystem"
            android:screenOrientation="portrait"
            />

        <service
            android:name="com.unibo.mobilitytrackingsystem.ARServices.ActivityRecognitionService"
            android:exported="false" />

        <receiver
            android:name="com.unibo.mobilitytrackingsystem.ARServices.ActivityRecognitionService$ActivityTransitionsReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="PROVA" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

I want to point out that the only error I get on Logcat when starting the AR is the following:

attributionTag com.google.android.gms.location_base not declared in manifest

0

There are 0 best solutions below