Skip to content

Add a method to get All Defined Permissions of the AndroidManifest.xml file. #1495

@danteCarvalho

Description

@danteCarvalho

Is there already an issue requesting this feature?

Please select affected platform(s)

  • Android
  • iOS
  • Windows

Use case

Currently Permission.values returns all permissions, if we had a getDefinedPermissions() that would return only the permissions i put on androidManifest.xml i coud loop the returned list to see if there is a permission that is not granted, and if there is i could just call list.request();

Proposal

i once made something like this on native android

  if (PermissionCheck.needToAsk(this)) {
            PermissionCheck.ask(this);
            return;
        }

public class PermissionCheck {

    private PermissionCheck() {

    }

    public static boolean needToAsk(Context context) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return false;
        }
        try {
            PackageInfo packageInfo;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS));
            } else {
                packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
            }
            String[] permissions = packageInfo.requestedPermissions;

            for (String permission : permissions) {
                if (isNotGranted(context, permission)) {
                    return true;
                }
            }

        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return false;
    }

    private static boolean isNotGranted(Context context, String permission) {
        if (Build.VERSION.SDK_INT < 31 && (permission.contains("BLUETOOTH_SCAN") || permission.contains("BLUETOOTH_ADVERTISE") || permission.contains("BLUETOOTH_CONNECT"))) {
            return false;
        }
        return ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED;
    }


    public static void ask(Activity context) {
        try {
            PackageInfo packageInfo;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS));
            } else {
                packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
            }
            String[] permissions = packageInfo.requestedPermissions;
            List<String> list = new ArrayList<>();
            for (String permission : permissions) {
                if (isNotGranted(context, permission)) {
                    list.add(permission);
                }
            }
            if (list.isEmpty()) {
                return;
            }
            String[] array = list.toArray(new String[0]);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                ActivityCompat.requestPermissions(context, array, 0);
            }


        } catch (PackageManager.NameNotFoundException e) {
            MetodosEstaticos.toastException(e, context);
        }
    }
}

But i guess a getDefinedPermissions would be enough.

Specific requirements or considerations

No response

Additional information or context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions