Android P: UsageStatsManager getAppStandbyBucket
Я хочу отобразить текущую корзину моего приложения на устройстве под Android P beta. Поэтому я пытаюсь использовать класс UsageStatsManager следующим образом:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= 28) {
UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(USAGE_STATS_SERVICE);
if (usageStatsManager != null) {
Log.d(TAG, "getAppStandbyBucket():" + usageStatsManager.getAppStandbyBucket());
}
}
}
Мой Манифест обладает разрешением android.permission.PACKAGE_USAGE_STATS:
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
Но я сталкиваюсь с падением при запуске приложения:
07-24 10:23:39.061 26967-26967/com.app.bucket E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.bucket, PID: 26967
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app.bucket/com.app.bucket.MainActivity}: java.lang.SecurityException: MATCH_ANY_USER flag requires INTERACT_ACROSS_USERS permission at com.android.server.pm.PackageManagerService.getPackageUid:4343 com.android.server.pm.PackageManagerService$PackageManagerInternalImpl.getPackageUid:23964 com.android.server.usage.UsageStatsService$BinderService.getAppStandbyBucket:927 android.app.usage.IUsageStatsManager$Stub.onTransact:274 android.os.Binder.execTransact:731 : Neither user 10118 nor current process has android.permission.INTERACT_ACROSS_USERS.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.SecurityException: MATCH_ANY_USER flag requires INTERACT_ACROSS_USERS permission at com.android.server.pm.PackageManagerService.getPackageUid:4343 com.android.server.pm.PackageManagerService$PackageManagerInternalImpl.getPackageUid:23964 com.android.server.usage.UsageStatsService$BinderService.getAppStandbyBucket:927 android.app.usage.IUsageStatsManager$Stub.onTransact:274 android.os.Binder.execTransact:731 : Neither user 10118 nor current process has android.permission.INTERACT_ACROSS_USERS.
at android.os.Parcel.createException(Parcel.java:1942)
at android.os.Parcel.readException(Parcel.java:1910)
at android.os.Parcel.readException(Parcel.java:1860)
at android.app.usage.IUsageStatsManager$Stub$Proxy.getAppStandbyBucket(IUsageStatsManager.java:658)
at android.app.usage.UsageStatsManager.getAppStandbyBucket(UsageStatsManager.java:479)
at com.app.bucket.MainActivity.onCreate(MainActivity.java:60)
Кажется, что я пропустил разрешение, но даже когда я добавляю следующее разрешение:
<uses-permission
android:name="android.permission.INTERACT_ACROSS_USERS"
tools:ignore="ProtectedPermissions" />
У меня все тот же сбой. Я думал, что, возможно, я пропускаю вызов времени выполнения для получения разрешения, но, как указано в документации:
ПРИМЕЧАНИЕ. Большинство методов этого API требуют разрешения android.permission.PACKAGE_USAGE_STATS. Однако объявление разрешения подразумевает намерение использовать API, и пользователю устройства все еще необходимо предоставить разрешение через приложение "Настройки". См. Settings.ACTION_USAGE_ACCESS_SETTINGS. Методы, которые только возвращают информацию для вызывающего пакета, не требуют этого разрешения. Например, getAppStandbyBucket() и queryEventsForSelf(long, long).
Это необязательно. Даже зная, что я пытался использовать разрешение во время выполнения, но я все равно получаю сбой. Если кто-нибудь увидит, чего не хватает, я был бы очень признателен за помощь.
1 ответ
Я думаю, что это ошибка. Существует открытая проблема, освещающая это в системе отслеживания проблем: https://issuetracker.google.com/issues/111102580.