android-cn / android-discuss

Android 问题交流讨论坛, 微信公众号:codekk, 网站:
https://github.com/android-cn/android-discuss/issues
Apache License 2.0
4.08k stars 536 forks source link

如何检测程序是否获得了某项权限? #174

Open start141 opened 9 years ago

start141 commented 9 years ago

众所周知,MIUI、Flyme等Android定制系统在程序请求打开相机、录音等操作时,系统会先弹出对话框提示用户是否允许程序执行这些操作,如果用户选择允许,则接下来的操作一切正常,如果用户选择拒绝之后,程序后面的工作将无法正常允许,甚至崩溃。

提问:在这种情况下,如何判断用户是拒绝还是允许了操作? 目前我知道用try catch可以粗暴的判断,但我不确定所有的权限请求被拒绝后都会抛异常。

各位有更好的办法吗?

skylixinxin commented 6 years ago

oppo checkPermission(Manifest.permission.READ_CONTACTS)始终返回true,即使禁用了该权限 我测试的机型:OPPO R9s(android 6.0),有什么方法可以辨别权限是否被禁用吗?同样遇到了这个问题,有人能给解答一下吗

WindyIT commented 6 years ago

public boolean hasPermission(@NonNull Context context, @NonNull List permissions) { if (VERSION.SDK_INT < 23) { return true; } else { Iterator var3 = permissions.iterator();

        int result;
        do {
            if (!var3.hasNext()) {
                return true;
            }

            String permission = (String)var3.next();
            result = context.checkPermission(permission, Process.myPid(), Process.myUid());
            if (result == -1) {
                return false;
            }

            String op = AppOpsManager.permissionToOp(permission);
            if (TextUtils.isEmpty(op)) {
                return true;
            }

            AppOpsManager appOpsManager = (AppOpsManager)context.getSystemService(AppOpsManager.class);
            result = appOpsManager.noteProxyOp(op, context.getPackageName());
        } while(result == 0);

        return false;
    }
}

摘自CPermission 可以尝试下 @skylixinxin

earthWo commented 5 years ago

@luffykou 我也遇到这种问题,vivo 不会报出Exception,这种方法不适用,你是怎么解决的呢 ??

用了这篇博客的方法,测试有效。 https://blog.csdn.net/lvwenbo0107/article/details/81035831

EspoirX commented 5 years ago

我就问下,vivo 怎么判断有没有悬浮窗权限,这个适配真的是非常操蛋。。