Android: проверьте, нужно ли запрашивать разрешения во время выполнения

Я хотел бы проверить, должно ли конкретное приложение обрабатывать разрешения времени выполнения Android Marshmallow во время выполнения или нет.

Правильно ли следующее предположение?

/**
 * Checks whether runtime permissions must be handled or not.
 *
 * @param context Application context.
 * @return Handle runtime permissions or not.
 */
public static boolean shouldCheckRuntimePermissions(Context context) {
    return
            isApplicationWithMarshmallowTargetSdkVersion(context) &&
                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}

/**
 * Checks whether the app is compiled with targetSdkVersion Marshmallow or above.
 *
 * @param context Application context.
 * @return Application targetSdkVersion above 23 or not.
 */
public static boolean isApplicationWithMarshmallowTargetSdkVersion(Context context) {
    return
            context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M;
}

Вот таблица, которую я разработал, где, например, ACCESS_COARSE_LOCATION разрешения были необходимы, чтобы запросить пользователя с разрешениями Android Marshmallow.

====================
target SDK |<23| 23|
====================
       |<23| X | X |
       ------------| 
OS SDK |23 | X | V |
====================   

Я знаю о существовании помощников библиотеки поддержки, но хочу избегать их в данном конкретном случае.

3 ответа

Решение

@LuisMiguelSierra был прав, у меня был ответ в ссылке, которую я разместил в конце моего вопроса, и я не понял вообще. Вот цитата, которая отвечает на мой вопрос и подтверждает мое предположение и методы были правильными:

Во всех версиях Android ваше приложение должно декларировать как обычные, так и опасные разрешения, которые ему необходимы, в манифесте приложения, как описано в разделе "Объявление разрешений". Однако эффект этого объявления различается в зависимости от версии системы и целевого уровня SDK вашего приложения:

  • Если устройство работает под управлением Android 5.1 или ниже, или целевой SDK вашего приложения равен 22 или ниже: Если вы указываете опасное разрешение в вашем
    манифест, пользователь должен предоставить разрешение при установке
    приложение; если они не дают разрешения, система вообще не устанавливает приложение.
  • Если устройство работает под управлением Android 6.0 или выше, а целевой SDK вашего приложения - 23 или выше: приложение должно перечислить разрешения в манифесте и должно запрашивать каждое опасное разрешение, в котором оно нуждается во время работы приложения. Пользователь может предоставлять или отклонять каждое разрешение, и приложение может продолжать работать с ограниченными
    возможности, даже если пользователь отклоняет запрос на разрешение.

Таким образом, это предположение о том, когда спрашивать разрешения, подтверждается:

====================
target SDK |<23| 23|
====================
       |<23| X | X |
       ------------| 
OS SDK |23 | X | V |
====================

Я проверяю вашу активность, если (версия API>= 23 и разрешение отклонено), тогда запрашивайте разрешение

if (android.os.Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_DENIED) {
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_LOCATION_PERMISSION);
}

И чтобы получить результат от пользователя просто переопределить

 @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_LOCATION_PERMISSION:
             if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.d(TAG,"Premission granted");
             }else {
                    Log.d(TAG,"Premission denied");
             }
             break;
    }
}

Вы можете попробовать использовать библиотеку EasyPermissions из Google Samples. Он обрабатывает проверки, связанные с разрешениями, и вам не нужно беспокоиться о проверке версий.

Другие вопросы по тегам