Android调试--创建文件失败(设置了权限)
2018-01-26 22:30
429 查看
背景
真机调试:小米4;系统Android6.0.1;API版本号23。下午在学习文件的建立,建立N久,查了很多资料都没找到。
看了一些资料说设置权限,实际上大多是说下面那条语句没有添加,但是我是添加了的,然后一直想不到怎么破,后来去上个厕所,灵感一来,直接真机设置权限!!!
File root = new File(Environment.getExternalStorageDirectory(),"ForAg"); File dayRecordRoot = new File(root,"dayRecord"); if (!root.exists()&&!dayRecordRoot.mkdirs()){ dayRecordRoot.mkdirs(); Log.w(TAG,"Couldn't make dir " + dayRecordRoot); }
其中设置了权限:
<manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </manifest>
分析
可以看到图片中读写权限是询问模式的,我直接改完允许之后成功的创建了文件。那么不可能以后适配都这么做吧。然后我就去查文档。
发现:
1.API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请
4000
的需求,更加安全。
2.从 Android 4.4(API 级别 19)开始,应用在外部存储空间写入其特定目录(getExternalFilesDir() 提供的目录)时不再需要请求WRITE_EXTERNAL_STORAGE 权限。但 API 级别 18 和更低版本需要此权限。因此,您可以使用如下声明,声明只有 API 级别 18 及以前版本才需要此权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
这样,从 API 级别 19 开始,系统将不再向您的应用授予 WRITE_EXTERNAL_STORAGE 权限。
此属性为 API 级别 19 中新增属性。
3.
<uses-permission-sdk-23>指明应用需要特定权限,但仅当应用在 API 级别 23 或更高版本的设备上运行时才需要。如果设备运行的是 API 级别 22 或更低版本,则应用没有指定的权限。如果使用
<uses-permission-sdk-23>元素而不使用
<uses-permission-sdk-23>,则仅当应用在支持运行时权限模式(用户在应用运行时向其授予权限)的平台上运行时才可请求权限。
<uses-permission-sdk-23 android:name="string" android:maxSdkVersion="integer" />
4.从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以对应用的功能进行更多控制;
解决方案
// 在要调用权限的activity中插入该方法。可以写到onCreate()中。 // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 判断是否有这个权限,是返回PackageManager.PERMISSION_GRANTED,否则是PERMISSION_DENIED // 这里我们要给应用授权所以是!= PackageManager.PERMISSION_GRANTED if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 如果应用之前请求过此权限但用户拒绝了请求,且没有选择"不再提醒"选项 (后显示对话框解释为啥要这个权限),此方法将返回 true。 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { } else { // requestPermissions以标准对话框形式请求权限。123是识别码(任意设置的整型),用来识别权限。应用无法配置或更改此对话框。 //当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,向其传递用户响应。您的应用必须替换该方法,以了解是否已获得相应权限。回调会将您传递的相同请求代码传递给 requestPermissions()。 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 123); } } } //当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,向其传递用户响应。您的应用必须替换该方法,以了解是否已获得相应权限。回调会将您传递的相同请求代码传递给 requestPermissions()。 @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 123: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //这里的两句语句是我写的创建文件的语句,在授权成功是时候会调用这里的语句。 FileManager.initFile(); Toast.makeText(this,"文件目录已经创建好了",Toast.LENGTH_SHORT).show(); // permission was granted, yay! Do the // contacts-related task you need to do. } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } // other 'case' lines to check for other // permissions this app might request }
如果不行的话。。我感觉可能导出APK安装的时候应该会有直接授权的行为,用ADB的话,也可以选择手动开启权限。
相关文章推荐
- Android 文件系统的权限设置
- Android应用程序里创建文件及改变权限
- android清单文件设置是否可以断点调试
- 关于Android系统中system.img和data.img中文件系统的权限设置【转】 转自:http://blog.chinaunix.net/u3/103613/showart_2218437.
- 设置守护进程的文件权限创建掩码
- java拷贝文件夹和android设置文件权限
- Oracle数据库案例整理-Oracle系统运行时故障-stage目录权限错误导致创建pfile文件失败
- 解决:Android使用自带sqlite开发时,apk中创建的数据库外部的进程是没有权限去读/写的,而且无法如何读取指定目录下的db文件
- AndroidManifest.xml文件--权限设置
- [Android]如何在编译阶段设置文件夹文件的权限属性(mode ,group, owner)
- java拷贝文件夹和android设置文件权限
- 解决问题:vs 使用命令行参数调试时出现"当前项目设置指定将使用特定的安全权限对该项目进行调试.在此模式下,命令行参数将不会传递给可执行文件."
- Android SD卡创建文件和文件夹失败
- Android 系统文件权限设置、用数字代表文件权限
- 关于Android系统中system.img和data.img中文件系统的权限设置
- 关于Android系统中system.img和data.img中文件系统的权限设置
- android文件缓存及SD卡创建文件夹失败解决和bitmap内存溢出解决
- 模拟器联网失败-批处理文件设置android系统中的DNS
- Android 文件系统的权限设置
- Android中使用照相机权限、在SD卡创建和删除文件权限、在SD卡中写入数据权限