检查不同的应用程序是否被授予权限
Checking if a DIFFERENT app is granted a permission
我在互联网上找到了两个选项来检查应用程序是否被授予权限。
选项 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 时也是如此。
所以我的问题是,还有哪些其他方法可用于确定不同的应用程序是否被授予权限,或者我在这段代码中做错了什么。
在进一步挖掘之后,我发现了 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;
}
这是由于 Android 11 项限制,以防止对已安装的应用进行指纹识别。
如果 targetSdkVersion
是 30+
。检查 Package Visibility or this article 了解更多信息。否则,您将在 logcat
.
中得到 PackageSetting{...... com.termux/......} BLOCKED
错误
<manifest
<queries>
<package android:name="com.termux" />
</queries>
</manifest>
我在互联网上找到了两个选项来检查应用程序是否被授予权限。
选项 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 时也是如此。 所以我的问题是,还有哪些其他方法可用于确定不同的应用程序是否被授予权限,或者我在这段代码中做错了什么。
在进一步挖掘之后,我发现了 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;
}
这是由于 Android 11 项限制,以防止对已安装的应用进行指纹识别。
如果 targetSdkVersion
是 30+
。检查 Package Visibility or this article 了解更多信息。否则,您将在 logcat
.
PackageSetting{...... com.termux/......} BLOCKED
错误
<manifest
<queries>
<package android:name="com.termux" />
</queries>
</manifest>