检查是否授予了一个不同的应用程序权限



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

选项1:

getPackageManager().checkPermission(permission_string, packageName);

选项2:

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

我在安卓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时也是如此。所以我的问题是,还有什么其他方法可以确定是否授予了另一个应用程序权限,或者,我在这段代码中做错了什么。

在挖掘了更多之后,我发现了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;
}

这是由于安卓11的限制,以防止安装的应用程序指纹识别。

您需要将目标包名称(例如com.termux(添加到queries元素,或者如果targetSdkVersion30+,则需要在AndroidManifest.xml中声明QUERY_ALL_PACKAGES权限。查看包可见性或本文了解更多信息。否则,您将在logcat中得到PackageSetting{...... com.termux/......} BLOCKED错误。

<manifest
<queries>
<package android:name="com.termux" />
</queries>
</manifest>

最新更新