您的位置:首页 > 移动开发 > Android开发

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的话,也可以选择手动开启权限。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐