Intereting Posts
Панель действий не отображается Метод, вызванный после исключения release (), не смог возобновить работу с камерой android Сохранить растровое изображение в Android в формате JPEG во внешнем хранилище в папке Android: измерение / обнаружение закрытой области прикосновением пальца на экране (не только касание координат) Подписание apk с .p12 Setter и Getter. В Android. Накладные расходы на производительность? Android4.4 не может обрабатывать sms-намерение с помощью «vnd.android-dir / mms-sms» Java.lang.SecurityException: отказ от разрешения: открытие провайдера com.google.android.apps.photos.content.GooglePhotosImageProvider Android. Можно ли вставлять значения @IntDef внутри @interface? Как конвертировать 24-х часовой формат в формат до 12 часов? Как я могу получить текущую дату в Android? Поддержка сторонних сайтов Amazon и Android (Google Play) внутри приложения Самоподписанный SSL-прием на Android Ошибка с аннотациями Override в Eclipse Проверьте, запущена ли функция из службы

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. Могу ли я избежать этого отдыха?
  2. Если нет, то как я могу переделать свой код для решения проблемы – я полностью идеальна на данный момент

EDIT 1:

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

EDIT 2:

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

ИЗМЕНИТЬ 3:

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

Solutions Collecting From Web of "Android Preview M: активность воссоздается после разрешения"

Вы всегда можете проверить условие загрузки сразу после того, как активность воссоздается в 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); }