无法显示安卓权限请求对话框



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

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

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

粘贴 Android 开发人员网站示例,了解如何启用权限,并在 Android 开发工作室中从头开始给出错误。

"第一个参数类型错误。找到:"android.content.Context",必需:"android.app.Activity" 检验信息: shouldShowRequestPermissionRationale (android.app.Activity,String) 在 ActivityCompat 中不能应用于 (android.content.Context,String)">

使用(活动)这可以消除错误,但此时对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.");
}
}
}
}

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

您的清单具有:

<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的使用。

最新更新