Android6.0权限改变
这里提供两种权限请求的封装方案
一.通过fragment中带有权限请求和回调的方法
1.传入参数
1.上下文 activity 或者fragment
2.请求的权限的列表
3.结果返回后的接口
2.工具封装
1.封装一个请求权限Fragment在fragment中请求
public class PermissionFragment extends Fragment {
//requestCode
private static final int PERMISSIONS_REQUEST_CODE = 1;
private PermissionListener listener;
public void setListener(PermissionListener listener) {
this.listener = listener;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@TargetApi(Build.VERSION_CODES.M)
public void requestPermissions(@NonNull String[] permissions) {
List<String> requestPermissionList = new ArrayList<>();
//找出所有未授权的权限
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(getContext(), permission) != PackageManager.PERMISSION_GRANTED) {
requestPermissionList.add(permission);
}
}
if (requestPermissionList.isEmpty()) {
//已经全部授权
permissionAllGranted();
} else {
//申请授权
requestPermissions(requestPermissionList.toArray(new String[requestPermissionList.size()]), PERMISSIONS_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode != PERMISSIONS_REQUEST_CODE) {
return;
}
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()) {
//已经全部授权
permissionAllGranted();
} else {
//勾选了对话框中”Don’t ask again”的选项, 返回false
for (String deniedPermission : deniedPermissionList) {
boolean flag = shouldShowRequestPermissionRationale(deniedPermission);
if (!flag) {
//拒绝授权
permissionShouldShowRationale(deniedPermissionList);
return;
}
}
//拒绝授权
permissionHasDenied(deniedPermissionList);
}
}
}
/**
* 权限全部已经授权
*/
private void permissionAllGranted() {
if (listener != null) {
listener.onGranted();
}
}
/**
* 权限被拒绝
*
* @param deniedList 被拒绝的权限List
*/
private void permissionHasDenied(List<String> deniedList) {
if (listener != null) {
listener.onDenied(deniedList);
}
}
/**
* 权限被拒绝并且勾选了不在询问
*
* @param deniedList 勾选了不在询问的权限List
*/
private void permissionShouldShowRationale(List<String> deniedList) {
if (listener != null) {
listener.onShouldShowRationale(deniedList);
}
}
}
2.通过传进来的activity或者fragment上下文生成工具fragment
public class PermissionUtil {
private static final String TAG = PermissionUtil.class.getSimpleName();
private PermissionFragment permissionFragment;
public PermissionUtil(@NonNull FragmentActivity activity) {
permissionFragment = getRxPermissionsActivity(activity);
}
public PermissionUtil(@NonNull Fragment fragment) {
permissionFragment = getRxPermissionsFragment(fragment);
}
private PermissionFragment getRxPermissionsActivity(FragmentActivity activity) {
PermissionFragment fragment = (PermissionFragment) activity.getSupportFragmentManager().findFragmentByTag(TAG);
boolean isNewInstance = fragment == null;
if (isNewInstance) {
fragment = new PermissionFragment();
FragmentManager fragmentManager = activity.getSupportFragmentManager();
fragmentManager.beginTransaction().add(fragment, TAG).commit();
fragmentManager.executePendingTransactions();
}
return fragment;
}
private PermissionFragment getRxPermissionsFragment(Fragment activity) {
PermissionFragment fragment = (PermissionFragment) activity.getChildFragmentManager().findFragmentByTag(TAG);
boolean isNewInstance = fragment == null;
if (isNewInstance) {
fragment = new PermissionFragment();
FragmentManager fragmentManager = activity.getChildFragmentManager();
fragmentManager.beginTransaction().add(fragment, TAG).commit();
fragmentManager.executePendingTransactions();
}
return fragment;
}
/**
* 外部使用 申请权限
*
* @param permissions 申请授权的权限
* @param listener 授权回调的监听
*/
public void requestPermissions(String[] permissions, PermissionListener listener) {
permissionFragment.setListener(listener);
permissionFragment.requestPermissions(permissions);
}
}
3.结果返回
请求结果通过接口设计
public interface PermissionListener {
void onGranted();
void onDenied(List<String> deniedPermission);
void onShouldShowRationale(List<String> deniedPermission);
}
4.demo下载地址
github:https://github.com/MatrixSpring/AndroidPermission