java - 无法显示 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.");
}
}
}
}
我希望弹出一个对话框,允许我授予打开下载文件夹中文件的必要权限。
解决方案
您的清单具有:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
您的 Java 代码没有引用READ_EXTERNAL_STORAGE
. 它指的是WRITE_EXTERNAL_STORAGE
。那些需要匹配。
要解决这个问题:
决定是否需要写
如果 #1 的答案是“是的,我需要写”,请切换您的清单以引用
WRITE_EXTERNAL_STORAGE
如果 #1 的答案是“不,阅读是基础”,请切换您的 Java 代码以参考
READ_EXTERNAL_STORAGE
推荐阅读
- selenium - 如何通过 Selenium 打开 Chrome 浏览器控制台?
- asp.net - 没有为此对象定义无参数构造函数。使用 asp.net mvc
- c# - 基础脑电图
- c# - 如何修复Unity中的“'GameObject'类型的对象已被破坏,但您仍在尝试访问它”错误?
- c# - 图像转换器在 Xamarin.Forms 中不起作用
- django - 成功消息不适用于创建视图
- dojo - 如何在dojo工具包的当前JS文件中使用另一个JS文件中创建的对话框变量
- php - 一些 index.php 文件生成或自动出现在我的文档根文件夹中
- sql - SSRS SQL 报表生成器删除列
- android - ArrayMap 比 arraylist 好?