【问题标题】:Android request run time permission not workingAndroid请求运行时权限不起作用
【发布时间】:2018-06-12 00:53:51
【问题描述】:

我在尝试在 Android 模拟器上请求运行时权限时遇到了一些问题。我要做的是在单击按钮后,请求读取和写入外部存储权限,然后再转到我的异步任务类。

这是我的代码:

private static final int PERMISSION_REQUEST_CODE = 1;
String readPermission = Manifest.permission.READ_EXTERNAL_STORAGE;
String writePermission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
@Click(R.id.buttonVersionUpgrade)
void buttonVersionUpgradeClicked(View v) {

    if (!checkPermission(readPermission) || !checkPermission(writePermission)) {
        requestPermission(readPermission);
        requestPermission(writePermission);
    }
   // async task here
}

private boolean checkPermission(String permission){
    if (Build.VERSION.SDK_INT >= 23) {
        int result = ContextCompat.checkSelfPermission(getApplicationContext(), permission);
        if (result == PackageManager.PERMISSION_GRANTED){
            return true;
        } else {
            return false;
        }
    } else {
        return true;
    }
}

private void requestPermission(String permission){
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)){
        Toast.makeText(getApplicationContext(), "Read/Write external storage permission allows us to read/write data. Please allow in App Settings for additional functionality.",Toast.LENGTH_LONG).show();
    }
    ActivityCompat.requestPermissions(this, new String[]{permission},PERMISSION_REQUEST_CODE);
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(getApplicationContext(), "Permission Granted. Now you can read/write data.",
                        Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(getApplicationContext(),"Permission Denied. You cannot read/write data.",
                        Toast.LENGTH_LONG).show();
            }
            break;
    }
}

但是,它不会在移动到异步任务执行之前提示用户授予权限,这会导致应用程序崩溃。它仅在应用程序崩溃时提示用户。有什么想法吗?

谢谢!

【问题讨论】:

    标签: java android permissions


    【解决方案1】:

    这是因为ActivityCompat.requestPermissions 不是同步调用。 OS 将显示弹出窗口(实际上是一个 Activity)并执行它后面的语句。

    因为这两个权限对于您的请求都是强制性的。

     if (!checkPermission(readPermission) || !checkPermission(writePermission)) {
            requestPermission(new String[] {readPermission,writePermission});        
      } else{
        //Run Async task directly since the permissions are already granted
      }
    
    
    
    private void requestPermission(String[] permissions){
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])||ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[1])){
            Toast.makeText(getApplicationContext(), "Read/Write external storage permission allows us to read/write data. Please allow in App Settings for additional functionality.",Toast.LENGTH_LONG).show();
        }
        ActivityCompat.requestPermissions(this, permissions,PERMISSION_REQUEST_CODE);
    }
    

    ActivityCompat.requestPermissions(this, permissions, requestCode);

    AsyncTask 执行移动到onRequestPermissionsResult,如下所示:

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (verifyGrantResults(grantResults)) {
                    Toast.makeText(getApplicationContext(), "Permission Granted. Now you can read/write data.",
                            Toast.LENGTH_LONG).show();
                            //start Async Task here
                } else {
                    Toast.makeText(getApplicationContext(),"Permission Denied. You cannot read/write data.",
                            Toast.LENGTH_LONG).show();
                }
                break;
        }
    }
    
    private boolean verifyGrantResults(final int[] grantResults) {
            boolean permissionsGranted = true;
            if (grantResults.length > 0) {
                for (int result : grantResults) {
                    if (result == PackageManager.PERMISSION_DENIED) {
                        permissionsGranted = false;
                    }
                }
                return permissionsGranted;
            }
            return false;
        }
    

    【讨论】:

    • @guest176969 太棒了!享受编码:-)
    • 嘿,我有问题。我意识到一旦授予权限并重新启动应用程序,它甚至不再运行我的异步任务
    • @guest176969 只需将 else 条件添加到 if (!checkPermission(readPermission) || !checkPermission(writePermission)) 并运行 AsyncTaskThere。检查更新的答案。
    • 嘿抱歉,我需要另一个安装权限,我可以将它添加到 String[] 的后面吗?
    • @guest176969 你可以在那里添加它,或者你可以更优雅地处理它。在onRequestPermissionsResult 中一一请求权限。例如。请求READ_EXTERNAL_STORAGEonRequestPermissionsResultREAD_EXTERNAL_STORAGE 请求WRITE_EXTERNAL_STORAGE 等等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多