Запрос разрешения на Android M, когда Min SDK равен L

Я пишу приложение, которое должно работать на Android L и M.

Как вы, наверное, знаете, для Android M нужно запрашивать в коде разрешение на запись\чтение из внешнего хранилища (sdcard), вот так:

if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)==
        PackageManager.PERMISSION_GRANTED)
    requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);

но я столкнулся с проблемой, потому что для вызова checkSelfPermission требуется уровень API 23 (а не 22, как мне нужно для поддержки Lollipop).

Я пытался добавить @TargetApi(Build.VERSION_CODES.MNC), но столкнулся с другой проблемой - "Cannot resolved symbol MNC"

Итак, вопрос, как я могу написать код для сохранения файла на SD-карте для Lollipop и Marshmallow?

EDIT: настройки структуры проекта:

Скомпилировать версию SDK: API 23: Android 5.X (MNC

Минимальная версия SDK: API 22: Android 5.1 (Lollipop)

Целевая версия SDK: API 23: Android 5.X (MNC)

Спасибо


person AsfK    schedule 17.11.2015    source источник
comment
Чтобы использовать функцию разрешения запроса зефира, установите для compileSdkVersion значение 23 и для targetSdkVersion значение 23.   -  person Dhaval Patel    schedule 17.11.2015
comment
@DhavalPatel, я уже сделал это, Compile Sdk Versuin = API 23:Android 5.X (MNC), Min Sdk = API 22 и Target SDK = API 23.   -  person AsfK    schedule 17.11.2015
comment
Вы можете узнать уровень API устройства, а затем соответствующим образом поместить свой код в блок if...else.   -  person pri    schedule 17.11.2015
comment
Используйте ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); вместо requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0) ;   -  person Dhaval Patel    schedule 17.11.2015


Ответы (2)


Измените версию компиляции на API 23 (MARSHMALLOW) и добавьте зависимости

dependencies {
  ...
 compile 'com.android.support:appcompat-v7:23.1.1'
  ...
  }

и поставить условие только зефир

  if (Build.VERSION.SDK_INT > 22) {
                        if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)==
    PackageManager.PERMISSION_GRANTED) {
                            // TODO: Consider calling
                            //    public void requestPermissions(@NonNull String[] permissions, int requestCode)
                            // here to request the missing permissions, and then overriding
                            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                            //                                          int[] grantResults)
                            // to handle the case where the user grants the permission. See the documentation
                            // for Activity#requestPermissions for more details.
                            return;
                        }
                    }

это потому, что метод checkselfpermission работает только в marsmallow

person Ribin Haridas    schedule 17.11.2015

Вам нужно использовать ActivityCompat, который является производным от ContextCompat.checkSelfPermission, который определен там. Вам нужно включить библиотеку поддержки Android в сборку gradle, чтобы использовать этот класс.

dependencies {
...
compile 'com.android.support:appcompat-v7:23.1.1'
...
}

public class YourActivity extends ActivityCompat {
    ...
    public void onStart() {
        ...
        checkSelfPermission(...);
        ...
    }
    ...
}
person Emanuel Seidinger    schedule 17.11.2015
comment
Извини, но не понял тебя. Можете ли вы объяснить, пожалуйста \ дать более подробную информацию \ показать пример? Спасибо ! - person AsfK; 17.11.2015
comment
Библиотека поддержки appcombat содержит классы с реализациями новых API, которые можно использовать с более низкими уровнями API. Вы можете использовать checkSelfPermission при использовании класса ActivityCompat в качестве базового класса вашей деятельности. Я отредактирую свой пост с примером. - person Emanuel Seidinger; 17.11.2015
comment
это доступно только для 23, вместо этого следует использовать ContextCompat.checkSelfPermission.. - person user25; 16.07.2018