在android高版本上有些權限是需要動態去申請的,現有模板共享之。
PermissionInterface.java:
public interface PermissionInterface { /** * 可設置請求權限請求碼 */ int getPermissionsRequestCode(); /** * 設置需要請求的權限 */ String[] getPermissions(); /** * 請求權限成功回調 */ void requestPermissionsSuccess(); /** * 請求權限失敗回調 */ void requestPermissionsFail(); }
PermissionUtil.java:
public class PermissionUtil { /** * 判斷是否有某個權限 * * @param context * @param permission * @return */ public static boolean hasPermission(Context context, String permission) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { return false; } } return true; } /** * 彈出對話框請求權限 * * @param activity * @param permissions * @param requestCode */ public static void requestPermissions(Activity activity, String[] permissions, int requestCode) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { activity.requestPermissions(permissions, requestCode); } } /** * 返回缺失的權限 * * @param context * @param permissions * @return 返回缺少的權限,null 意味着沒有缺少權限 */ public static String[] getDeniedPermissions(Context context, String[] permissions) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ArrayList<String> deniedPermissionList = new ArrayList<>(); for (String permission : permissions) { if (context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { deniedPermissionList.add(permission); } } int size = deniedPermissionList.size(); if (size > 0) { return deniedPermissionList.toArray(new String[deniedPermissionList.size()]); } } return null; } }
PermissionHelper.java:
public class PermissionHelper { private Activity mActivity; private PermissionInterface mPermissionInterface; public PermissionHelper(Activity activity, PermissionInterface permissionInterface) { mActivity = activity; mPermissionInterface = permissionInterface; } /** * 開始請求權限。 * 方法內部已經對Android M 或以上版本進行了判斷,外部使用不再需要重複判斷。 * 如果設備還不是M或以上版本,則也會回調到requestPermissionsSuccess方法。 */ public void requestPermissions() { String[] deniedPermissions = PermissionUtil.getDeniedPermissions(mActivity, mPermissionInterface.getPermissions()); if (deniedPermissions != null && deniedPermissions.length > 0) { PermissionUtil.requestPermissions(mActivity, deniedPermissions, mPermissionInterface.getPermissionsRequestCode()); } else { Log.d("wujiang","requestPermissions"); mPermissionInterface.requestPermissionsSuccess(); } } /** * 在Activity中的onRequestPermissionsResult中調用 * * @param requestCode * @param permissions * @param grantResults * @return true 代表對該requestCode感興趣,並已經處理掉了。false 對該requestCode不感興趣,不處理。 */ public boolean requestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == mPermissionInterface.getPermissionsRequestCode()) { boolean isAllGranted = true;//是否全部權限已授權 for (int result : grantResults) { if (result == PackageManager.PERMISSION_DENIED) { isAllGranted = false; break; } } if (isAllGranted) { //已全部授權 mPermissionInterface.requestPermissionsSuccess(); } else { //權限有缺失 mPermissionInterface.requestPermissionsFail(); } return true; } return false; } }
讓主activity implements PermissionInterface並實現其方法:
public static final int REQUEST_CODE = 10;
@Override public int getPermissionsRequestCode() { return REQUEST_CODE; } @Override public String[] getPermissions() { //設置該界面所需的全部權限 return new String[]{ Manifest.permission.RECORD_AUDIO, Manifest.permission.MODIFY_AUDIO_SETTINGS }; } @Override public void requestPermissionsSuccess() { //權限申請成功,做你想做的事情吧 } @Override public void requestPermissionsFail() { //權限請求不被用戶允許。可以提示並退出或者提示權限的用途並重新發起權限申請。 Log.d("wujiang","requestPermissionsFail"); Toast.makeText(this, "Your have no permission ", Toast.LENGTH_LONG).show(); }
在主activity的oncreate裏調用:
//初始化併發起權限申請 mPermissionHelper = new PermissionHelper(this, this); mPermissionHelper.requestPermissions();
在主activity裏實現如下方法:
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(mPermissionHelper.requestPermissionsResult(requestCode, permissions, grantResults)){ //權限請求結果,並已經處理了該回調 return; } }
THE END