检查不同的应用程序是不是被授予权限

Posted

技术标签:

【中文标题】检查不同的应用程序是不是被授予权限【英文标题】:Checking if a DIFFERENT app is granted a permission检查不同的应用程序是否被授予权限 【发布时间】:2021-09-18 17:04:01 【问题描述】:

我在互联网上阅读了两个选项来检查应用程序是否被授予权限。

选项 1:

getPackageManager().checkPermission(permission_string, packageName);

选项 2:

(PackageInfo.requestedPermissionsFlag[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0

我在 android 11 上运行。我正在实现一种机制,在单击应用程序时,将检查权限状态,如果权限不被允许,则会提示用户允许它。我只检查“高级”权限,这意味着需要用户从设置屏幕允许它们的权限,例如管理外部存储(适用于 android 11)、drawOverlay、writeSettings 等。无论如何,这是我正在使用的代码:

try 
            PackageInfo pi = getPackageManager().getPackageInfo(currAppInfo.getName(), PackageManager.GET_PERMISSIONS);
            for(int i=0; i<pi.requestedPermissions.length; i++)
            
                String perm = pi.requestedPermissions[i];
                
                PermissionInfo permi = getPackageManager().getPermissionInfo(perm, PackageManager.GET_META_DATA);
                if(getPackageManager().checkPermission(perm, currAppInfo.getName()) == 0)
                    continue;
                if(AdvancedPermissionHandler.isAdvancedPermission(permi))
                
                    AdvancedPermissionHandler.openSettingsPage(permi, currAppInfo.getName(), MainActivity.this);
                    return;
                
            
         catch (Exception e) 
            e.printStackTrace();
        

我面临的唯一问题是,即使我使用选项 1 并且即使我使用选项 2,我总是在支票上弄错。意思是,假设我单击了一个需要管理外部存储的应用程序,并且它的状态当前是不允许的。我点击应用程序,我被移动到相应的屏幕,我允许权限,我回到主屏幕,当我再次点击应用程序时,我被移动到同一个权限屏幕,而不是打开。调试器显示

getPackageManager().checkPermission(permission_string, packageName);

正在返回 false,即使已授予权限。当我使用选项 2 时也是如此。 所以我的问题是,还有哪些其他方法可以用来确定不同的应用程序是否被授予权限,或者我在这段代码中做错了什么。

【问题讨论】:

【参考方案1】:

在挖掘了更多之后,我发现了 AppOps。 这是我以前工作的代码,Android 11:

AppOpsManager appOps = (AppOpsManager)getSystemService(Context.APP_OPS_SERVICE);
            ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(currAppInfo.getName(), 0);

            PackageInfo pi = getPackageManager().getPackageInfo(currAppInfo.getName(), PackageManager.GET_PERMISSIONS);
            for(int i=0; i<pi.requestedPermissions.length; i++)
            
                String perm = pi.requestedPermissions[i];
                PermissionInfo permi = getPackageManager().getPermissionInfo(perm, PackageManager.GET_META_DATA);
                if(AppOpsManager.permissionToOp(permi.name) == null)
                    continue;
                boolean granted = (appOps.unsafeCheckOpNoThrow(AppOpsManager.permissionToOp(permi.name),applicationInfo.uid,currAppInfo.getName()) == AppOpsManager.MODE_ALLOWED);
                if(granted)
                    continue;
            

【讨论】:

以上是关于检查不同的应用程序是不是被授予权限的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法检查 NSPhotoLibraryAddUsageDescription 权限是被授予还是被拒绝?

ReactNative:如何检查用户是不是已授予 gps 权限

如何检查用户是不是已在 React Native Android 中授予相机权限?

即使用户授予位置权限检查,三星 note 20 也总是会被拒绝

Android:检查是不是在另一个类中授予权限,而不是在 MainActivity

我如何知道浏览器通知是不是被 Windows 阻止