Programmatically retrieve permissions from manifest.xml in android

You can get an application's requested permissions (they may not be granted) using PackageManager:

PackageInfo info = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
String[] permissions = info.requestedPermissions;//This array contains the requested permissions.

I have used this in a utility method to check if the expected permission is declared:

//for example, permission can be "android.permission.WRITE_EXTERNAL_STORAGE"
public boolean hasPermission(String permission) 
{
    try {
        PackageInfo info = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
        if (info.requestedPermissions != null) {
            for (String p : info.requestedPermissions) {
                if (p.equals(permission)) {
                    return true;
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

Here's a useful utility method that does just that (in both Java & Kotlin).

Java

public static String[] retrievePermissions(Context context) {
    final var pkgName = context.getPackageName();
    try {
        return context
                .getPackageManager()
                .getPackageInfo(pkgName, PackageManager.GET_PERMISSIONS)
                .requestedPermissions;
    } catch (PackageManager.NameNotFoundException e) {
         return new String[0];
         // Better to throw a custom exception since this should never happen unless the API has changed somehow.
    }
}

Kotlin

fun retrievePermissions(context: Context): Array<String> {
    val pkgName = context.getPackageName()
    try {
        return context
                .packageManager
                .getPackageInfo(pkgName, PackageManager.GET_PERMISSIONS)
                .requestedPermissions
    } catch (e: PackageManager.NameNotFoundException) {
        return emptyArray<String>()
        // Better to throw a custom exception since this should never happen unless the API has changed somehow.
    }
}

You can get a working class from this gist.