定义一个接口:
package com.itant.zhuling.base;
/**
* Created by Jason on 2017/4/15.
*/
public interface IPermission {
void onPermissionSuccess(int requestCode);
void onPermissionFail(int requestCode);
}
activity implements 该接口
// 权限
private static final int REQUEST_NECESSARY_PERMISSIONS = 1;
private static String[] PERMISSIONS_NECESSARY = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.CAMERA
};
// 申请权限
PermissionTool.initPermission(this, PERMISSIONS_NECESSARY, REQUEST_NECESSARY_PERMISSIONS);
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionTool.onActivityPermissionResult(this, requestCode, grantResults);
}
@Override
public void onPermissionSuccess(int requestCode) {
}
@Override
public void onPermissionFail(int requestCode) {
// 没有赋予权限
}
PermissionTool.java
package com.itant.zhuling.tool;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import com.itant.zhuling.base.IPermission;
import java.util.List;
/**
* Created by Jason on 2017/4/9.
*/
public class PermissionTool {
/**
* 初始化权限
*/
public static void initPermission(Activity activity, String[] permissions, int requestCode) {
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M) {
return;
}
boolean isGranted = true;
for (String permission : permissions) {
int result = ActivityCompat.checkSelfPermission(activity, permission);
if (result != PackageManager.PERMISSION_GRANTED) {
isGranted = false;
break;
}
}
if (!isGranted) {
// 还没有的话,去申请权限
ActivityCompat.requestPermissions(activity, permissions, requestCode);
}
}
public static void onActivityPermissionResult(IPermission permission, int requestCode, @NonNull int[] grantResults) {
boolean granted = true;
for (int result : grantResults) {
granted = result == PackageManager.PERMISSION_GRANTED;
if (!granted) {
break;
}
}
if (granted) {
permission.onPermissionSuccess(requestCode);
} else {
permission.onPermissionFail(requestCode);
}
}
/**
* 赋予读写URI对应文件的权限
* @param intent
* @param uri
*/
public static void grantUriPermission(Context context, Intent intent, Uri uri) {
if (Build.VERSION.SDK_INT < 24) {
return;
}
List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
//将存储图片的uri读写权限授权给剪裁工具应用
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
}
注意:
1. 以上仅针对Acitivity或CompactActivity而言,如果在Fragment或FragmentActivity,请使用:
HomeFragment.this.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
1);
- 动态申请权限时一定要同时在清单文件中同时申请相应权限。
参考:
http://blog.csdn.net/xiaoqiang_0719/article/details/53009323
http://blog.csdn.net/yzjjdcf/article/details/50509039