2015-07-15 3 views
13

Я играю с Preview M и тестирую свое приложение на нем, особенно часть «сохранение файла во внешнее хранилище». Перед тем как скачать/сохранить начинается процесс, я прошу дляAndroid 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. Если нет, то как я могу переделать свой код, чтобы решить эту проблему - я полностью idealess на данный момент

EDIT 1:

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

EDIT 2:

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

EDIT 3:

Нет отдыха не происходит с последним SDK 6.0 (версия 23) - может быть, кто-нибудь слышал мой плач в Маунтин-Вью :-)

+0

Эй, как вы в конце концов решили это сделать? Я также компилирую с версией 23, и я все еще сталкиваюсь с действиями перезапуска на разрешении разрешать и отказывать. Метод onRequestPermissionsResult никогда не вызывается. Я вызываю requestPermissions() из фрагмента. Разве это имеет значение? –

+0

@Mayur More: как вы отменяете/предоставляете разрешение? При отмене/предоставлении внутренних настроек приложения у меня все еще есть отдых после возобновления приложения. Но внутри рабочего процесса приложения - как описано выше - никакого отдыха не происходит ... –

+0

никогда, я его решил. –

ответ

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

thx за вашу помощь, но см. Мое редактирование! –

Смежные вопросы