import android.annotation.TargetApi; import android.app.Activity; import android.app.FragmentManager; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; /** * @author nks * @date 2018/11/30 * 6.0权限申请工具类 */ public class FastPermission { private static FastPermission ourInstance = null; private FastPermission() { } public static FastPermission getInstance() { // 加入双重校验锁 // 校验锁1:第1个if if (ourInstance == null) { synchronized (FastPermission.class) { // 校验锁2:第2个 if if (ourInstance == null) { ourInstance = new FastPermission(); } } } return ourInstance; } /** * 检查指定权限是否已经获取 */ @TargetApi(Build.VERSION_CODES.M) public boolean isAccept(Context context, String permission) { if (!isNeedCheck(context)) { return true; } else { return context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED; } } /** * 判断是否需要检查权限。运行版本大于6.0并且使用该库的targetSdkVersion大于23时才检查 * * @return 返回true代表版本号大于6.0需要检查权限 */ public boolean isNeedCheck(Context context) { int targetSdkVersion = context.getApplicationInfo().targetSdkVersion; return Build.VERSION.SDK_INT >= 23 && targetSdkVersion >= 23; } /** * 跳转到应用的设置界面 */ public void goToAppDetailSetting(Context context) { Intent localIntent = new Intent(); localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); localIntent.setData(Uri.fromParts("package", context.getPackageName(), null)); context.startActivity(localIntent); } /** * 使用Fragment申请权限 * * @param callback 权限申请 成功、失败回调 * @param perms 权限列表数组 */ public void request(Context context, String[] perms, PermissionCallback callback) { PermissionFragment fragment = null; FragmentManager fm = getActivity(context).getFragmentManager(); fragment = (PermissionFragment) fm.findFragmentByTag(PermissionFragment.class.getSimpleName() + "tag"); if (fragment == null) { fragment = new PermissionFragment(); fm.beginTransaction() .add(fragment, PermissionFragment.class.getSimpleName() + "tag") .commitAllowingStateLoss(); } fragment.requestMyPermission(context, perms, callback); } /** * 上面方法在某些情况下失灵,所以使用该方法 by txs */ public PermissionFragment initFragment(Context context) { PermissionFragment permissionFragment = null; FragmentManager fm = getActivity(context).getFragmentManager(); permissionFragment = (PermissionFragment) fm.findFragmentByTag(PermissionFragment.class.getSimpleName() + "tag"); if (permissionFragment == null) { permissionFragment = new PermissionFragment(); fm.beginTransaction() .add(permissionFragment, PermissionFragment.class.getSimpleName() + "tag") .commitAllowingStateLoss(); fm.executePendingTransactions(); } return permissionFragment; } /** * 获取activity */ private static Activity getActivity(Context context) { if (context instanceof Activity) { return (Activity) context; } if (context instanceof ContextWrapper) { ContextWrapper wrapper = (ContextWrapper) context; return getActivity(wrapper.getBaseContext()); } else { return null; } } }
import android.app.Fragment; import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import java.util.ArrayList; import java.util.List; /** * @author nks * @date 2018/11/30 * 使用fragment进行6.0权限申请 ,避免v4以及v7包的问题 */ public class PermissionFragment extends Fragment { private PermissionCallback mPermissionCallback; //权限回调的标识 private static final int REQUEST_CODE = 0X0122; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public void requestMyPermission(Context context, final String[] perms, final PermissionCallback callback) { mPermissionCallback = callback; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { List<String> permissionList = new ArrayList<>(); for (String permission : perms) { //查找是否有某个权限 if (!FastPermission.getInstance().isAccept(context, permission)) { permissionList.add(permission); } } if (permissionList.size() > 0) { //申请权限 PermissionFragment.this.requestPermissions(permissionList.toArray(new String[]{}), REQUEST_CODE); } } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_CODE: if (grantResults.length > 0) { //未获得的权限组合 List<String> deniedList = new ArrayList<String>(); for (int j = 0; j < grantResults.length; j++) { int grantResult = grantResults[j]; String permission = permissions[j]; if (grantResult != PackageManager.PERMISSION_GRANTED) { deniedList.add(permission); } } //已全部允许 if (deniedList.isEmpty()) { mPermissionCallback.onGranted(); } else { mPermissionCallback.onDenied(deniedList); } } break; default: break; } } }
import java.util.List; /** * @author nks * @date 2018/11/30 * 6.0权限回调 */ public interface PermissionCallback { /** * 权限允许 */ void onGranted(); /** * 权限拒绝 * * @param perms 被拒绝的权限集合 */ void onDenied(List<String> perms); }
具体使用方式
permissionFragment = FastPermission.getInstance().initFragment(mContext);
/** * 适配android6.0所需要的权限,写入你所需要的权限 */ public static final String[] PERMISSION_ARRAY = {Manifest.permission.INTERNET};
//适配6.0权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //需要的权限 String[] permission = Config.PERMISSION_ARRAY; //申请权限列表 List<String> permissionList = new ArrayList<>(); for (String per : permission) { if (!FastPermission.getInstance().isAccept(mContext, per)) { //没有权限则加入list permissionList.add(per); } } if (permissionList.size() > 0) { if (permissionFragment.isAdded()) { permissionFragment.requestMyPermission(mContext, permissionList.toArray(new String[]{}), new PermissionCallback() { @Override public void onGranted() { //获得权限成功 } @Override public void onDenied(List<String> perms) { //有权限未获得 } }); } } else { //已有权限 } //6.0以下手机 } else { //写你需要的操作 }