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);
}