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