Есть ли способ проверить разрешение манифеста из кода?

Как проверить конкретное разрешение в файле manifest.xml из кода? Я хочу бросить какое-то исключение, если некоторые разрешения, необходимые для моего приложения, отсутствуют.

Например, FINE_LOCATION и COARSE_LOCATION Я знаю, что андроид также выдаст исключение при запуске определенной активности, использующей GPS, но мне нужно проверить манифест и бросить исключение при запуске самого приложения. Это относится не только к доступу к местоположению, но и к другим разрешениям.

Любые предложения были бы полезными.

Ответы

Ответ 1

Вы можете проверить, предоставлено ли разрешение или нет для конкретного разрешения, с помощью PackageManager. Например

    PackageManager pm = getPackageManager();
    if (pm.checkPermission(permission.FINE_LOCATION, getPackageName()) == PackageManager.PERMISSION_GRANTED) {
        // do something
    } else {
        // do something
    }

Ответ 2

Вы можете прочитать доступные теги <uses-permission> во время выполнения, используя следующее. Протестировано на более ранних версиях Android и Android 6 и 7

PackageManager pm = getPackageManager();
try
{
    PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS);
    String[] requestedPermissions = null;
    if (packageInfo != null) {
        requestedPermissions = packageInfo.requestedPermissions;
    }

    if (requestedPermissions != null && requestedPermissions.length > 0)
    {
        List<String> requestedPermissionsList = Arrays.asList(requestedPermissions);
        ArrayList<String> requestedPermissionsArrayList = new ArrayList<String>();
        requestedPermissionsArrayList.addAll(requestedPermissionsList);

        Log.i(ExConsts.TAG, ""+requestedPermissionsArrayList);
    }
}
catch (PackageManager.NameNotFoundException e)
{
    e.printStackTrace();
}