首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android请求运行时权限不起作用

Android请求运行时权限不起作用
EN

Stack Overflow用户
提问于 2018-06-12 08:53:52
回答 1查看 142关注 0票数 1

当我尝试在Android模拟器上请求运行时权限时遇到了一些问题。我正在尝试做的是在点击按钮时,在进入我的异步任务类之前请求对外部存储的读写权限。

下面是我的代码:

代码语言:javascript
复制
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;
    }
}

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-12 08:56:39

这是因为ActivityCompat.requestPermissions不是同步调用。操作系统将显示弹出窗口(实际上是一个活动),随后的语句将被执行。

因为这两个权限对于您同时请求它们是强制的。

代码语言:javascript
复制
 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,如下所示:

代码语言:javascript
复制
@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;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50807882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档