Android6.0以上,在sd卡上存取文件时即使在mainfest文件中声明权限如下
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
也会报错无权限,还要在应用运行的时候动态申请(在/data/data/com.cosber.wse.atf/目录下无须权限)
新建公共类如下:
package com.cosber.wse.atf.utils;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import static com.cosber.wse.atf.utils.LogUtils.myLog;
public class PermisionUtils {
// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
public static void verifyStoragePermissions(Activity activity) {//检查权限
int permission = ActivityCompat.checkSelfPermission(activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {//无权限
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE);//动态赋权
}
}
}
然后直接在需要授权的地方调用:
verifyStoragePermissions(this);
在弹出的对话框中选择允许即可,允许后除非卸载应用,否则无须重新赋权
对话框回调:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:
switch (permissions[0]){
case android.permission.WRITE_EXTERNAL_STORAGE://权限1 WRITE_EXTERNAL_STORAGE
if (grantResults.length > 0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
//允许权限
}else {//拒绝权限
Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
}
break;
case android.permission.READ_EXTERNAL_STORAGE://权限2
if (grantResults.length > 0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
//允许权限
} else {
Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
}
break;
default:
}
break;
default:
}
}