检查是否为另一个应用程序授予了外部存储管理器

TiJ*_*iJo 6 permissions android android-external-storage android-11

我需要检查其他应用程序是否具有外部存储管理器的权限。和

Environment.isExternalStorageManager()
Run Code Online (Sandbox Code Playgroud)

我检查当前应用程序是否已被授予。我如何为另一个应用程序执行此操作?我已经尝试检查权限状态

getPackageManager().checkPermission(Manifest.permission.MANAGE_EXTERNAL_STORAGE, "dk.tacit.android.foldersync.lite")
Run Code Online (Sandbox Code Playgroud)

但它总是返回 -1,这意味着 PERMISSION_DENIED,即使授予了权限。

DrH*_*Doo 4

您可以尝试使用AppOpsManager类,如下所示:

try {
        PackageManager packageManager = this.getPackageManager();
        ApplicationInfo info = packageManager.getApplicationInfo("package name",0);
        Log.d("TAG", "onCreate: "+hasPermission(this,info)); 
        
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

现在的hasPermission功能:

@RequiresApi(api = Build.VERSION_CODES.R)
public static boolean hasPermission(Context context,ApplicationInfo info) {
    boolean granted = false;
    AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
    int mode = appOps.unsafeCheckOpNoThrow(AppOpsManager.permissionToOp("android.permission.MANAGE_EXTERNAL_STORAGE"), info.uid, info.packageName);
    if (mode == AppOpsManager.MODE_DEFAULT)
        granted = (context.checkCallingOrSelfPermission(Manifest.permission.MANAGE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
    else
        granted = (mode == AppOpsManager.MODE_ALLOWED);
    return granted;
}
Run Code Online (Sandbox Code Playgroud)

您还必须QUERY_ALL_PACKAGES在清单中声明许可:

<uses-permission
    android:name="android.permission.QUERY_ALL_PACKAGES"
    tools:ignore="QueryAllPackagesPermission" />
Run Code Online (Sandbox Code Playgroud)