動態申請權限模板

在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章