首页 > 解决方案 > 无法显示 android 权限请求对话框

问题描述

尝试从下载目录中读取我正在处理的应用程序的文件,但我终生无法打开对话框,让用户授予访问文件的权限。

尝试添加从用户可以从其他站点下载的文件中导入数据的功能。尝试从下载文件夹打开文件不过是失败。最后确定绝对是访问未启用文件的权限,并且我无法获得允许权限出现的对话框。放弃并从头开始创建一个新应用程序

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

粘贴在 android 开发者网站示例中,说明如何启用权限并在 android 开发工作室中从头开始给出错误。

“错误的第一个参数类型。发现:'android.content.Context',必需:'android.app.Activity' 检查信息:ActivityCompat 中的 shouldShowRequestPermissionRationale (android.app.Activity,String) 不能应用于 (android.content.Context ,细绳)”

使用 (activity)this 可以消除错误,但目前对 android 文档不太信任。仍然无法获得权限对话框。毫无乐趣地尝试其他几个示例和 Stackoverflow“解决方案”。

从头开始完成基本应用程序,坚持一些 printlns 以显示进度,模拟器或我的手机中没有对话框。Logcat显示一切似乎都在这个过程中工作,它找到了不允许的权限,分支到请求它的部分,然后测试响应是否允许它,除了它实际打开对话框的部分。我没有找到任何与 egl 错误相关的内容。示例日志猫:

07-20 08:30:19.999 23735-23735/anticlimacticteleservices.myapplication I/System.out: need to ask for permission
07-20 08:30:20.014 23735-23775/anticlimacticteleservices.myapplication D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
07-20 08:30:20.049 23735-23775/anticlimacticteleservices.myapplication I/OpenGLRenderer: Initialized EGL, version 1.4
07-20 08:30:20.050 23735-23775/anticlimacticteleservices.myapplication W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
07-20 08:30:20.096 23735-23775/anticlimacticteleservices.myapplication D/EGL_emulation: eglCreateContext: 0xaaa757e0: maj 2 min 0 rcv 2
07-20 08:30:20.099 23735-23775/anticlimacticteleservices.myapplication D/EGL_emulation: eglMakeCurrent: 0xaaa757e0: ver 2 0 (tinfo 0xac396210)
07-20 08:30:20.133 23735-23775/anticlimacticteleservices.myapplication D/EGL_emulation: eglMakeCurrent: 0xaaa757e0: ver 2 0 (tinfo 0xac396210)
07-20 08:30:20.181 23735-23735/anticlimacticteleservices.myapplication I/System.out: You denied write external storage permission.
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;


public class MainActivity extends AppCompatActivity {
    private static final int PERMISSION_REQUEST_CODE = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Context thisActivity = this;
        try{
            int writeExternalStoragePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if(writeExternalStoragePermission!= PackageManager.PERMISSION_GRANTED){
               System.out.println("need to ask for permission");
               ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
            }else {
                System.out.println("it actually has permission now");
            }
        }catch (Exception ex)        {
            System.out.println("failed to get permissions with "+ex.getMessage());
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,  int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode == PERMISSION_REQUEST_CODE)        {
            int grantResultsLength = grantResults.length;
            if(grantResultsLength > 0 && grantResults[0]==PackageManager.PERMISSION_GRANTED) {
                System.out.println("You did it finally");
            }else {
                System.out.println("You denied write external storage permission.");
            }
        }
    }

}

我希望弹出一个对话框,允许我授予打开下载文件夹中文件的必要权限。

标签: javaandroidpermissions

解决方案


您的清单具有:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

您的 Java 代码没有引用READ_EXTERNAL_STORAGE. 它指的是WRITE_EXTERNAL_STORAGE。那些需要匹配。

要解决这个问题:

  1. 决定是否需要写

  2. 如果 #1 的答案是“是的,我需要写”,请切换您的清单以引用WRITE_EXTERNAL_STORAGE

  3. 如果 #1 的答案是“不,阅读是基础”,请切换您的 Java 代码以参考READ_EXTERNAL_STORAGE

FWIW,本书中的这个示例应用程序演示了.WRITE_EXTERNAL_STORAGE


推荐阅读