Francesco Mameli
Francesco Mameli

Reputation: 125

Android 6 UsageStatsManager isAppInactive() permission

I'm using isAppInactive() method from UsageStatsManager class on Android 6 (API 23) to detect the standby state of the app I'm developing.

The docs affirm that it is necessary to request PACKAGE_USAGE_STATS permission but I'm able to use that method without requesting the permission.

Is this a bug?

Upvotes: 0

Views: 1243

Answers (1)

Mattia Maestrini
Mattia Maestrini

Reputation: 32790

In UsageStatsService there is a hasPermission [1] method that checks if the permission PACKAGE_USAGE_STATS is granted. It is used in this methods:

  • queryEvents [2]
  • queryConfigurations [3]
  • queryUsageStats [4]
  • queryAndAggregateUsageStats (it uses the same method of queryUsageStats)

This is the code of isAppInactive [5], and you can see how the permission is not requested:

@Override
public boolean isAppInactive(String packageName, int userId) {
    try {
        userId = ActivityManagerNative.getDefault().handleIncomingUser(Binder.getCallingPid(),
                Binder.getCallingUid(), userId, false, true, "isAppInactive", null);
    } catch (RemoteException re) {
        return false;
    }
    final long token = Binder.clearCallingIdentity();
    try {
        return UsageStatsService.this.isAppIdleFilteredOrParoled(packageName, userId, -1);
    } finally {
        Binder.restoreCallingIdentity(token);
    }
}

As you can see in the message of commit that adds isAppInactive (originally is called isAppIdle then it is renamed) the API should be public:

Add ability to get and set idle state of apps
Add am shell command to set and get idle
Add public API to check if an app is idle

I don't think this is a bug, but only an unclear documentation.

Upvotes: 1

Related Questions