Android预览M:在权限授予后重新创建活动

A.D*_*.D. 13 permissions android preview android-activity

我使用预览M并测试我的应用程序,特别是"将文件保存到外部存储"部分.在下载/保存过程开始之前,我请求

  Manifest.permission.WRITE_EXTERNAL_STORAGE
Run Code Online (Sandbox Code Playgroud)

开发者页面上描述的权限:https://developer.android.com/preview/features/runtime-permissions.html

对话框按预期发生:

"Allow <AppName> to access photos, media, and files on your device?" Deny / Allow
Run Code Online (Sandbox Code Playgroud)

如果我点击"拒绝"按钮,则调用活动的onRequestPermissionsResult方法.

如果我按下"允许"按钮,则首先重新创建活动,然后调用onRequestPermissionsResult方法.我认为这是获得许可的结果.

但第二种情况很棘手,因为我想触发一个开始下载的回调,但此时此对象为null:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 我可以避免这种娱乐吗?
  2. 如果不是,我如何重新设计我的代码来解决问题 - 我现在完全是理想的

编辑1:

我尝试用处理程序和postDelayed解决问题 - 但我跳过它.

编辑2:

我初步解决了它并向用户显示了再次按下下载按钮的请求(如果获得了许可).但谷歌:你是否很严重?

编辑3:

最新的SDK 6.0(版本23)没有重新开始 - 也许有人听到我在Mountain View中哭泣:-)

Neo*_*eoh 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);
}
Run Code Online (Sandbox Code Playgroud)