一個Android動態權限的流式權限管理庫EasyPermission,幫你申請動態權限

轉載請註明出處https://blog.csdn.net/yeluofengchui/article/details/91126117

EasyPermission

README: 中文 | English

EasyPermission簡介

這個是一個方便Android中權限管理的庫,它使得申請權限和業務代碼邏輯簡單分離,不去關心權限的申請和回調。
源碼地址:https://github.com/githubZYQ/easypermission

初衷

以前你是怎麼管理Android的權限的?

先判斷有沒有權限,再申請權限,最後onRequestPermissionsResult中檢查一個個結果,再執行自己的業務邏輯?

有一個打電話的權限,好多地方都要用,你每次使用打電話都要寫一遍權限的判斷申請和結果處理?

那現在有一個好消息:

這兒有一個方便Android中權限管理的庫,你告訴它你需要的權限,然後再告訴它你想要執行什麼,就可以了。

解釋

1.module-easypermissionlib是EasyPermission 的核心源碼code;

2.module-app是EasyPermission的一個使用demo;

集成方法

第一步. 添加JitPack 將其添加到根build.gradle中.

allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}

第二步. 添加依賴

dependencies {
	        implementation 'com.github.githubZYQ:easypermission:v1.0.0'
	}

第三步.調用 onRequestPermissionsResult()。
將要使用EasyPermission的Activity中的onRequestPermissionsResult,調用EasyPermissionHelper.getInstance().onRequestPermissionsResult即可;

如果你有BaseActivity,那麼只需要在BaseActivity中設置一次即可。

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //使用EasyPermissionHelper注入回調
        EasyPermissionHelper.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

功能使用

接下來看下怎麼使用。

1.檢測權限

只需要調用EasyPermission的hasPermission方法,支持多個權限同時傳入。

EasyPermission.build().hasPermission(this, Manifest.permission.CALL_PHONE);

2.申請權限

如果你在應用啓動時需要申請權限,而且並不關注權限的結果,

只需要調用EasyPermission的requestPermission方法,支持多個權限傳入。

 EasyPermission.build().requestPermission(MainActivity.this, Manifest.permission.CALL_PHONE);

3.需要權限的結果

如果你需要知道申請權限後用戶的選擇結果,同時去執行自己的方法myVoid(),

那麼在onPermissionsAccess中去做就可以了,

onPermissionsDismiss是用戶拒絕了權限的反饋。

 EasyPermission.build()
                .mRequestCode(RC_CODE_CALLPHONE)
                .mContext(NeedReslutActivity.this)
                .mPerms(Manifest.permission.CALL_PHONE)
                .mResult(new EasyPermissionResult() {
                    @Override
                    public void onPermissionsAccess(int requestCode) {
                        super.onPermissionsAccess(requestCode);
                        //做你想做的
                    }

                    @Override
                    public void onPermissionsDismiss(int requestCode, @NonNull List<String> permissions) {
                        super.onPermissionsDismiss(requestCode, permissions);
                        //你的權限被用戶拒絕了你怎麼辦
                    }
                }).requestPermission();

4.有時用戶拒絕了權限,而且禁止了彈出詢問,我該怎麼辦?

同上,只要在onDismissAsk中,就可以得到被禁止的結果,同時你要注意onDismissAsk默認返回false

如果你自己修改return true,將視爲已經處理了禁止結果,將不再回調onPermissionsDismiss這個方法,

調用openAppDetails方法,可以彈窗引導用戶去設置界面設置權限,在onActivityResult中檢查結果。

 EasyPermission easyPermission = EasyPermission.build()
                .mRequestCode(RC_CODE_CALLPHONE)
                .mContext(DismissAskActivity.this)
                .mPerms(Manifest.permission.CALL_PHONE)
                .mResult(new EasyPermissionResult() {
                    @Override
                    public void onPermissionsAccess(int requestCode) {
                        super.onPermissionsAccess(requestCode);
                        //做你想做的
                    }

                    @Override
                    public void onPermissionsDismiss(int requestCode, @NonNull List<String> permissions) {
                        super.onPermissionsDismiss(requestCode, permissions);
                        //你的權限被用戶拒絕了你怎麼辦
                    }

                    @Override
                    public boolean onDismissAsk(int requestCode, @NonNull List<String> permissions) {
                        //你的權限被用戶禁止了並且不能請求了你怎麼辦
                        easyPermission.openAppDetails(DismissAskActivity.this, "Call Phone - Give me the permission to dial the number for you");
                        return true;
                    }
                });
        easyPermission.requestPermission();

        
        @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if (EasyPermission.APP_SETTINGS_RC == requestCode) {
                    //設置界面返回
                    //Result from system setting
                    if (easyPermission.hasPermission(DismissAskActivity.this)) {
                        //做你想做的
                    } else {
                        //從設置回來還是沒給你權限
                    }
        
                }
            }

拓展

仔細看了Android的權限使用過程,其實內心覺得,關於需要申請的權限的地方,
都是使用的系統的API,那麼Android系統爲何不能在APP使用某項權限時自己攔截諮詢用戶,
用戶允許了就繼續執行,不允許給開發者一個反饋,這樣豈不是好?

我真心覺得權限管理、申請、判斷都應該是系統完成的,
讓開發者去註冊聲明需要哪些權限可以理解,
但是動態的每次使用都要去判斷、申請、回調等等真的對開發者不友好,
希望後續系統能有所改進,
如果有能直接反饋給Google的Android團隊的,希望將此聲音帶過去。

如果你有更好的方案,比如HOOK技術跳過系統的權限檢測等等,歡迎評論交流。

最後

祝所有人平安幸福、家庭和睦、身體健康。

願世界和平,不再被戰爭所累。

有任何疑問,可以及時反饋給我;

如果你覺得還不錯,請點贊o( ̄▽ ̄)d。

轉載請註明出處https://blog.csdn.net/yeluofengchui/article/details/91126117

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