轉載請註明出處 http://blog.csdn.net/qq_31715429/article/details/52786614
本文出自:猴菇先生的博客
在app中用到動態判斷運行時權限的地方還是蠻多的,比如讀寫SD卡、獲取電話信息、拍照、定位啥的,每次的重複代碼也蠻多的。看了郭霖大神CSDN公開課直播Android6.0運行時權限,講了如何封裝,下面是改過之後的代碼:
1、在BaseActivity中:
//6.0以上系統判斷權限 --> start
private static final int RUNTIME_PERMISSION_REQUEST_CODE = 1;
private RuntimePermissionListener mRuntimePermissionListener;
/**
* 檢查運行時權限
*
* @param permissions 所檢查的權限數組
* @param runtimePermissionListener 運行時權限監聽器
*/
public void checkRuntimePermission(String[] permissions, RuntimePermissionListener runtimePermissionListener) {
mRuntimePermissionListener = runtimePermissionListener;
List<String> deniedPermissionList = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {//判斷權限是否允許
deniedPermissionList.add(permission);
}
}
if (deniedPermissionList.isEmpty()) {
//權限全部允許
mRuntimePermissionListener.onRuntimePermissionGranted();
} else {
String[] deniedPermissionArray = deniedPermissionList.toArray(new String[deniedPermissionList.size()]);
//請求未允許的權限
ActivityCompat.requestPermissions(this, deniedPermissionArray, RUNTIME_PERMISSION_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case RUNTIME_PERMISSION_REQUEST_CODE:
if (grantResults.length > 0) {
List<String> deniedPermissionList = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
deniedPermissionList.add(permissions[i]);
}
}
if (deniedPermissionList.isEmpty()) { //權限全部允許
mRuntimePermissionListener.onRuntimePermissionGranted();
} else {//有拒絕的權限
mRuntimePermissionListener.onRuntimePermissionDenied();
}
}
}
}
/**
* 運行時權限監聽器
*/
public interface RuntimePermissionListener {
/**
* 允許所請求的全部權限
*/
void onRuntimePermissionGranted();
/**
* 拒絕所請求的部分或全部權限
*/
void onRuntimePermissionDenied();
}
//6.0以上系統判斷權限 --> end
2、在需要檢查權限的activity中使用:
/**
* 請求權限
*/
private void checkRuntimePermission() {
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE
, Manifest.permission.CALL_PHONE
, Manifest.permission.ACCESS_COARSE_LOCATION};
checkRuntimePermission(permissions, new RuntimePermissionListener() {
@Override
public void onRuntimePermissionGranted() {
//do something
}
@Override
public void onRuntimePermissionDenied() {
ToastUtil.show(MAinActivity.this, "拒絕該權限將無法使用部分功能");
}
});
}
3、如果在fragment中怎麼用呢,那就在BaseFragment中:
/**
* 檢查運行時權限
*
* @param permissions 所檢查的權限數組
* @param runtimePermissionListener 運行時權限監聽器
*/
public void checkRuntimePermission(String[] permissions, RuntimePermissionListener runtimePermissionListener) {
Activity activity = getActivity();
if (activity instanceof BaseActivity) {
((BaseActivity) activity).checkRuntimePermission(permissions, runtimePermissionListener);
}
}
使用方法和在activity中一樣~
附上郭神視頻錄播地址:http://edu.csdn.net/course/detail/3539