Android權限的基本寫法

1 在BaseActivity中添加方法

 public void runTimeRequestPermission(final Activity activity, List<String> requestPermissionLists, PermissionCallBack permissionCallBack) {
        if (requestPermissionLists.isEmpty()) {
            return;
        }
        mPermissionCallBack = permissionCallBack;
        List<String> requestPermissionList = AppUtils.findDeniedPermissions(activity, requestPermissionLists);
        if (requestPermissionList.isEmpty() || requestPermissionList.size() <= 0) {
            mPermissionCallBack.granted();
        } else {
            ActivityCompat.requestPermissions(activity, requestPermissionList.toArray(new String[requestPermissionList.size()]), YOUR_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case YOUR_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()||deniedPermissionList.size()<=0) {
                        mPermissionCallBack.granted();
                    } else {
                        mPermissionCallBack.denied(deniedPermissionList);
                    }
                }
                break;
            default:
                break;
        }
    }

2 在BaseFragment中

    public void runTimeRequestPermission(final Activity activity, List<String> requestPermissionLists, PermissionCallBack permissionCallBack) {
        if (requestPermissionLists.isEmpty()) {
            return;
        }
        mPermissionCallBack = permissionCallBack;
        List<String> requestPermissionList = AppUtils.findDeniedPermissions(activity, requestPermissionLists);
        if (requestPermissionList.isEmpty() || requestPermissionList.size() <= 0) {
            mPermissionCallBack.granted();
        } else {
            requestPermissions(requestPermissionList.toArray(new String[requestPermissionList.size()]), YOUR_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case YOUR_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()) {
                        mPermissionCallBack.granted();
                    } else {
                        mPermissionCallBack.denied(deniedPermissionList);
                    }
                }
                break;
            default:
                break;
        }
    }

3 書寫一個權限申請的回調接口

public interface PermissionCallBack {
    /**
     * 全部已授權
     */
    void granted();
    /**
     * 未授權權限
     * @param permissionList 未授權的權限集合
     */
    void denied(List<String> permissions);
}

4 注意事項 參考地址

1. 權限申請儘量是需要的時候纔去進行申請
2. 如果用戶拒絕權限可以進行一些友好提示,避免程序崩潰
3. checkSelfPermission:檢查是否擁有這個權限
4. requestPermissions:請求權限,一般會彈出一個系統對話框,詢問用戶是否開啓這個權限。
5. shouldShowRequestPermissionRationale:Android原生系統中,如果第二次彈出權限申請的對話框,會出現“以後不再彈出”的提示框,如果用戶勾選了,你再申請權限,    則shouldShowRequestPermissionRationale返回true,意思是說要給用戶一個 解釋,告訴用戶爲什麼要這個權限。然而,在實際開發中,需要注意的是,很多手機對原生     系統做了修改,比如小米,小米4的6.0的shouldShowRequestPermissionRationale 就一直返回false,而且在申請權限時,如果用戶選擇了拒絕,則不會再彈出對話框了  所以說這個地方有坑,我的解決方法是,在回調裏面處理,如果用戶拒絕了這個權限,則打開本應用信息界面,由用戶自己手動開啓這個權限。
6. 每個應用都有自己的權限管理界面,裏面有本應用申請的權限以及各種狀態,即使用戶已經同意了你申請的權限,他也隨時可以關閉
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章