Предоставление разрешений на внешнее хранилище без перезапуска приложения

Для устройств Android с API 23 или выше, как я могу предоставить разрешения на внешнее хранилище без перезапуска приложения (вроде того, как музыкальная библиотека пользователя загружается в Google Play Music в течение одного сеанса)? Я знаю, что эта проблема решалась несколько раз здесь, в SO, но пока мне не повезло.

Вот разрешения в моем файле манифеста:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Основная деятельность:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23
        if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);

            return; // Included here to prevent the app from crashing.
        }
    }

    /**
     * CODE HERE FOR INSTANTIATIONS AND SUCH.
     */
}

... Потому что на данный момент мне нужно перезапустить приложение для прохождения разрешений (и экземпляров MainActivity и т. Д.) после принятия разрешений из начального всплывающего окна.

Огромное спасибо.


person DaveNOTDavid    schedule 21.02.2017    source источник
comment
Мне нужно перезапустить приложение, чтобы разрешения прошли - нет, вы этого не сделаете. ПЕРЕМЕСТИТЕ КОД СЮДА ДЛЯ ИСПОЛЬЗОВАНИЯ ИЛИ ТАКИХ ОБЪЯВЛЕНИЙ. в другой метод. Вызовите этот метод из onCreate(), если у вас уже есть разрешения на этот момент. Также вызовите этот метод из onRequestPermissionsResult(), если пользователь согласился с этими разрешениями. См., Например, этот образец проекта.   -  person CommonsWare    schedule 21.02.2017


Ответы (1)


Как предлагает @CommonsWare, вы можете поместить весь свой код, который выполняет ИНСТАНЦИИ И ТАКИЕ, в такой метод, как instantiateMyObjects(), и вызвать его в onCreate(), например

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23
        if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSION_CODE);
            // Define the constant MY_PERMISSION_CODE.

            return; // Included here to prevent the app from crashing.
        }
    }

    instantiateMyObjects();
}

И когда пользователь принимает / отклоняет ваш запрос разрешения, вызывается onRequestPermissionsResult(). Не забудьте определить MY_PERMISSION_CODE, например, как 1.

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

    if (requestCode == MY_PERMISSION_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Now you can instantiate your objects.
            instantiateMyObjects();
        } else {
            // User denied it.
        }
    }
}
person Shreyash S Sarnayak    schedule 21.02.2017