如何檢查是否給“android.permission.PACKAGE_USAGE_STATS”權限?




permissions usage-statistics (2)

checkOpNoThrow的第二個參數是uid ,而不是pid

更改代碼以反映這似乎解決了其他人遇到的問題:

AppOpsManager appOps = (AppOpsManager) context
    .getSystemService(Context.APP_OPS_SERVICE);
int mode = appOps.checkOpNoThrow("android:get_usage_stats", 
    android.os.Process.myUid(), context.getPackageName());
boolean granted = mode == AppOpsManager.MODE_ALLOWED;

背景

我試圖獲取應用程序啟動的統計信息,並且在棒棒糖上,可以通過使用UsageStatsManager類(如此處原始的帖子):

表現:

<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions"/>

打開讓用戶確認給你這個權限的活動:

startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));

獲取統計信息,匯總:

 private static final String USAGE_STATS_SERVICE ="usagestats"; // Context.USAGE_STATS_SERVICE);
 ...
 final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService(USAGE_STATS_SERVICE);
 final Map<String,UsageStats> queryUsageStats=usageStatsManager.queryAndAggregateUsageStats(fromTime,toTime);

問題

我似乎無法檢查是否授予您所需的權限(“android.permission.PACKAGE_USAGE_STATS”)。 到目前為止,我所嘗試過的所有方式總是會被拒絕。

代碼工作,但權限檢查不能正常工作。

我試過了

您可以使用以下方法檢查授予的權限:

String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getContext().checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;   

或這個:

String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getPackageManager().checkPermission(permission,getPackageName())== PackageManager.PERMISSION_GRANTED;   

兩者總是返回,它被拒絕(即使我已經授予作為用戶的權限)。

查看UsageStatsManager的代碼,我試圖想出這個解決方法:

      UsageStatsManager usm=(UsageStatsManager)getSystemService("usagestats");
      Calendar calendar=Calendar.getInstance();
      long toTime=calendar.getTimeInMillis();
      calendar.add(Calendar.YEAR,-1);
      long fromTime=calendar.getTimeInMillis();
      final List<UsageStats> queryUsageStats=usm.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,fromTime,toTime);
      boolean granted=queryUsageStats!=null&&queryUsageStats!=Collections.EMPTY_LIST;

它的工作,但它仍然是一個解決方法。

這個問題

我怎麼沒有得到權限檢查的正確結果?

應該做什麼來檢查它更好?


用戶在系統設置(使用狀態訪問,通知訪問...)中授予的特殊權限由Android 4.4中添加的AppOpsManager處理。

請注意,除了授予您在系統設置中訪問權限的用戶之外,您通常還需要Android清單(或某個組件)的權限,而您的應用程序甚至不會在系統設置中顯示。 對於使用統計信息,您需要android.permission.PACKAGE_USAGE_STATS權限。

沒有太多的文檔,但你可以隨時檢查Android的來源。 這個解決方案可能看起來有些AppOpsManager ,因為一些常量稍後添加到AppOpsManager ,並且一些常量(例如,用於檢查不同的權限)仍然隱藏在私有API中。

AppOpsManager appOps = (AppOpsManager) context
        .getSystemService(Context.APP_OPS_SERVICE);
int mode = appOps.checkOpNoThrow("android:get_usage_stats", 
        android.os.Process.myUid(), context.getPackageName());
boolean granted = mode == AppOpsManager.MODE_ALLOWED;

這告訴你,如果權限是由用戶授予。 請注意,因為API級別21有不變的AppOpsManager.OPSTR_GET_USAGE_STATS = "android:get_usage_stats"

我測試了棒棒糖(包括5.1.1)這個檢查,它按預期工作。 它告訴我用戶是否給出了明確的許可而沒有任何崩潰。 還有方法appOps.checkOp()可能會拋出SecurityException





usagestatsmanager