Android Preview M: активность воссоздается после получения разрешения

Я играю с Preview M и тестирую свое приложение на нем, особенно часть "сохранение файла на внешнее хранилище". Перед запуском процесса загрузки/сохранения я запрашиваю

  Manifest.permission.WRITE_EXTERNAL_STORAGE

как описано на странице разработчика: https://developer.android.com/preview/features/runtime-permissions.html

Диалог происходит, как ожидалось:

"Allow <AppName> to access photos, media, and files on your device?" Deny / Allow

Если я нажму кнопку "deny", вызывается метод onRequestPermissionsResult для операции.

Если я нажимаю кнопку "разрешить", активность сначала воссоздается, а затем вызывается метод onRequestPermissionsResult. Я думаю, что это результат предоставленного разрешения.

Но вторая ситуация сложна, потому что я хочу вызвать обратный вызов, который запускает загрузку, но этот объект на данный момент равен нулю:

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

    getLogger().error("onRequestPermissionsResult ( " + requestCode + ", " + permissions + ", " + grantResults + " )");
    switch (requestCode) {


        //permission for saving files?
        case PermissionCode.WRITE_EXTERNAL_STORAGE: {


            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                //HERE IS THE NULL-OBJECT 
                if (controller != null) {

                    controller.triggerCallback();
                }
            }
            break;
        }
        default: {

            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

Итак, мои вопросы:

  • Можно ли избежать этого отдыха?
  • Если нет, как я могу изменить свой код для решения проблемы - я полностью идеальна на данный момент

РЕДАКТИРОВАТЬ 1:

Я попытался решить проблему с обработчиком и postDelayed, но я пропустил его.

ИЗМЕНИТЬ 2:

Я предварительно решил его и покажу Toast пользователю с просьбой снова нажать кнопку загрузки (в случае предоставленного разрешения). Но Google: ВЫ СЕРЬЕЗНЫЕ?

ИЗМЕНИТЬ 3:

Никакой отдых не происходит с последним SDK 6.0 (версия 23) - возможно, кто-то слышал мой плач в Mountain View: -)

Ответы

Ответ 1

Вы всегда можете проверить условие загрузки сразу после того, как активность воссоздается в onCreate():

static final int MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0;
boolean initiateDownload = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(savedInstanceState != null) {
        initiateDownload = savedInstanceState.getBoolean("toDownload");
    }
}

@Override
public void onResume() {
    super.onResume();
    final boolean hasPermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED;
    if(initiateDownload && hasPermission) {
        // start download here...
    } else {
        requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE},
                MainActivity.MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE) {
        if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            initiateDownload = true;
        } else {
            // denied permission...
        }
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean("toDownload", initiateDownload);
}