Require AR permission to access step events
Requires that an application targeting Android Q and later has the AR
runtime permission in order to access the Step Detector and the Step
Counter. Applications that target pre-Q are not required to hold the
permission. If an application that targets pre-Q holds the GMS Core AR
install time permission and the user revokes the permission, then the
application will no longer be able to receive Step Detector or Step
Counter events.
The following scenarios were tested:
A = Receive events without explicitly granting permission
B = Receive events after granting runtime permission
C = Receive events after revoking any available permission
Install = GMS Core install time permission
Runtime = android.permission.ACTIVITY_RECOGNITION runtime permission
SDK Version: | Has Permission: | Could Receive:
Compile Target | Install Runtime | A B C
Q Q Yes Yes No Yes No
Q Q Yes No No N/A N/A
Q Q No Yes No Yes No
Q Q No No No N/A N/A
Q P Yes Yes Yes Yes No
Q P Yes No Yes Yes No
Q P No Yes Yes Yes No
Q P No No Yes Yes N/A
P P Yes Yes Yes Yes No
P P Yes No Yes Yes No
P P No Yes Yes Yes No
P P No No Yes Yes N/A
Bug: 130640415
Test: Builds
Test: Scenarios listed aboved
Change-Id: Iffe4aff731efd1fe20fa7b4a8245262db8b32d03
diff --git a/libs/sensor/Sensor.cpp b/libs/sensor/Sensor.cpp
index d9a986e..139987e 100644
--- a/libs/sensor/Sensor.cpp
+++ b/libs/sensor/Sensor.cpp
@@ -22,6 +22,13 @@
#include <binder/IPermissionController.h>
#include <binder/IServiceManager.h>
+/*
+ * The permission to use for activity recognition sensors (like step counter).
+ * See sensor types for more details on what sensors should require this
+ * permission.
+ */
+#define SENSOR_PERMISSION_ACTIVITY_RECOGNITION "android.permission.ACTIVITY_RECOGNITION"
+
// ----------------------------------------------------------------------------
namespace android {
// ----------------------------------------------------------------------------
@@ -116,7 +123,7 @@
mStringType = SENSOR_STRING_TYPE_HEART_RATE;
mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS;
AppOpsManager appOps;
- mRequiredAppOp = appOps.permissionToOpCode(String16(SENSOR_PERMISSION_BODY_SENSORS));
+ mRequiredAppOp = appOps.permissionToOpCode(String16(mRequiredPermission));
mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
} break;
case SENSOR_TYPE_LIGHT:
@@ -165,14 +172,22 @@
mFlags |= SENSOR_FLAG_WAKE_UP;
}
break;
- case SENSOR_TYPE_STEP_COUNTER:
+ case SENSOR_TYPE_STEP_COUNTER: {
mStringType = SENSOR_STRING_TYPE_STEP_COUNTER;
+ mRequiredPermission = SENSOR_PERMISSION_ACTIVITY_RECOGNITION;
+ AppOpsManager appOps;
+ mRequiredAppOp =
+ appOps.permissionToOpCode(String16(mRequiredPermission));
mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;
- break;
- case SENSOR_TYPE_STEP_DETECTOR:
+ } break;
+ case SENSOR_TYPE_STEP_DETECTOR: {
mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR;
+ mRequiredPermission = SENSOR_PERMISSION_ACTIVITY_RECOGNITION;
+ AppOpsManager appOps;
+ mRequiredAppOp =
+ appOps.permissionToOpCode(String16(mRequiredPermission));
mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE;
- break;
+ } break;
case SENSOR_TYPE_TEMPERATURE:
mStringType = SENSOR_STRING_TYPE_TEMPERATURE;
mFlags |= SENSOR_FLAG_ON_CHANGE_MODE;