【问题标题】:"Usage Stats" Permission throws error?“使用情况统计”权限引发错误?
【发布时间】:2018-07-14 20:31:27
【问题描述】:

我一直在使用this Stackoverflow answer来检查用户是否已经授予“使用统计”权限:

 boolean granted = false;
        AppOpsManager appOps = (AppOpsManager) this
                .getSystemService(Context.APP_OPS_SERVICE);
        int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
                android.os.Process.myUid(), this.getPackageName());

        if (mode == AppOpsManager.MODE_DEFAULT) {
            granted = (this.checkCallingOrSelfPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) == PackageManager.PERMISSION_GRANTED);
        } else {
            granted = (mode == AppOpsManager.MODE_ALLOWED);
        }

        if (!granted) {
            activate.setChecked(false);
            new AlertDialog.Builder(this)
                    .setTitle("First enable permission!")
                    .setMessage("In order to use this app, you must enable the Usage permission")
                    .setPositiveButton("Enable", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
                            startActivity(intent);
                        }
                    }).show();
        }

上述代码在我的 7.0 设备上运行良好,但是当我模拟 4.4 Kitcat 设备时,出现以下错误:

 java.lang.IllegalArgumentException: Unknown operation string: android:get_usage_stats
        at android.app.AppOpsManager.strOpToOp(AppOpsManager.java:855)
        at android.app.AppOpsManager.checkOpNoThrow(AppOpsManager.java:885)
        at com.curlybrace.ruchir.keepfocusneverprocrastinateagain.MainActivity.checkPermissions(MainActivity.java:714)
        at com.curlybrace.ruchir.keepfocusneverprocrastinateagain.MainActivity.activated(MainActivity.java:639)
        at com.curlybrace.ruchir.keepfocusneverprocrastinateagain.MainActivity$4.onCheckedChanged(MainActivity.java:241)
        at android.widget.CompoundButton.setChecked(CompoundButton.java:127)
        at android.widget.Switch.setChecked(Switch.java:666)
        at android.widget.CompoundButton.toggle(CompoundButton.java:87)
        at android.widget.CompoundButton.performClick(CompoundButton.java:99)
        at android.view.View$PerformClick.run(View.java:18422)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)

由这条线int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS引起。似乎没有其他人遇到过这个问题,所以我不确定这里的问题是什么。感谢所有帮助。

【问题讨论】:

    标签: java android algorithm permissions usage-statistics


    【解决方案1】:

    UsageStatsManager 已添加到 API 级别 21。OPSTR_GET_USAGE_STATS 也已添加到 API 级别 21。您将无法在 API 级别 19 上使用这些。

    【讨论】:

    • 有什么方法可以查看用户是否有 >API 级别 21 的使用情况统计信息?或者这根本不可能
    • @RuchirBaronia:大概,您可以在 API Level 21+ 设备上使用现有代码。您在 API 级别 19 设备上崩溃。从理论上讲,构建工具应该对您大喊 OPSTR_GET_USAGE_STATS 比您的 minSdkVersion 更新,并且您应该添加适当的逻辑以仅在 API 级别 21+ 设备上执行此代码。
    • 有道理。那么低版本设备的合适逻辑是什么?是否可以在
    • @RuchirBaronia:“是否可以在
    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 2011-03-14
    • 2021-10-15
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多