原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)
前言:動(dòng)態(tài)權(quán)限管理是Android6.0(Build.VERSION_CODES.M = Api23)推出的,提醒用戶當(dāng)前APP所需要的權(quán)限,防止濫用。這些權(quán)限一般分為三種:(1)普通權(quán)限:直接manifest清單文件中寫上注冊就行了 (2)危險(xiǎn)權(quán)限:需要?jiǎng)討B(tài)申請 (3)特殊權(quán)限:此處暫不說明。
注意:這里我們就按照原生,和git上比較出名的第三方權(quán)限管理工具,EasyPermissions和RxPermissions
一、參考
二、異常
異常:java.lang.SecurityException: getDeviceId: Neither user 10127 nor current process has android.permission.READ_PHONE_STATE.
解釋:走到方法getDeviceId這里異常,缺失權(quán)限:READ_PHONE_STATE,先檢查manifest.xml清單文件里有沒有,沒有補(bǔ)上,如果有,那么這個(gè)權(quán)限就得動(dòng)態(tài)獲取了。
三、流程
1、第一次詢問權(quán)限 -》允許權(quán)限(再次詢問同樣權(quán)限也不會(huì)彈框,已注冊)
2、第一次詢問權(quán)限-》拒絕權(quán)限-》再次詢問權(quán)限-》允許權(quán)限(再次詢問同樣權(quán)限也不會(huì)彈框,已注冊)
3、第一次詢問權(quán)限-》拒絕權(quán)限-》再次詢問權(quán)限-》不再詢問(再次詢問同樣權(quán)限也不會(huì)有彈框,直接拒絕)
--------------------幾張圖片說明--------------------
first_request.png
not_first_request.png
not_first_request_and_not_ask_again.png
四、實(shí)例
1、原生,比較長且繁瑣,先理解下
/**
* 測試:原生動(dòng)態(tài)權(quán)限管理
* */
private void testOrgPermission(){
//判斷當(dāng)前系統(tǒng)是否高于或等于6.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//已注冊權(quán)限
if (ContextCompat.checkSelfPermission(instance, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
//todo something
LogUtil.i("testOrgPermission() : this camera permission is granted");
}
//未注冊權(quán)限,申請權(quán)限
else {
// v4向下兼容:詢問權(quán)限(這里可以一個(gè),也可以多個(gè))
// 拒絕權(quán)限后再次詢問
LogUtil.i("testOrgPermission() : this camera premission is denied , " +
"ready to request this permission");
ActivityCompat.requestPermissions(instance,
new String[]{Manifest.permission.CAMERA},
REQUEST_PERMISSION_CAMERA_CODE);
}
}
//當(dāng)前系統(tǒng)小于6.0,無需動(dòng)態(tài)申請權(quán)限
else {
//todo something
}
}
/**
* 詢問權(quán)限的回調(diào)函數(shù)
* */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case REQUEST_PERMISSION_CAMERA_CODE:
int cameraResult = grantResults[0];//相機(jī)權(quán)限
boolean cameraGranted = cameraResult == PackageManager.PERMISSION_GRANTED;//拍照權(quán)限
//注冊權(quán)限
if (cameraGranted) {
LogUtil.i("onRequestPermissionsResult() : "+permissions[0]+
" request granted , to do something...");
//todo something
}
//拒絕注冊權(quán)限
else {
//無權(quán)限,且被選擇"不再提醒":提醒客戶到APP應(yīng)用設(shè)置中打開權(quán)限
if(!ActivityCompat.shouldShowRequestPermissionRationale(instance,Manifest.permission.CAMERA)){
LogUtil.e("onRequestPermissionsResult() : this "+permissions[0]+" is denied " +
"and never ask again");
ToastUtil.showShort(instance,"拒絕權(quán)限,不再彈出詢問框,請前往APP應(yīng)用設(shè)置中打開此權(quán)限");
//todo nothing
}
//無權(quán)限,只是單純被拒絕
else{
LogUtil.e("onRequestPermissionsResult() : "+permissions[0]+"request denied");
ToastUtil.showShort(instance,"拒絕權(quán)限,等待下次詢問哦");
//todo request permission again
}
}
break;
default:break;
}
}
2、EasyPermissions:挺簡潔的
//build中依賴easypermissions
dependencies {
implementation 'pub.devrel:easypermissions:1.1.2'
}
#notice:這里要實(shí)現(xiàn)回調(diào)接口 Activity implements EasyPermissions.PermissionCallbacks
/**
* 測試:EasyPermission
* https://github.com/googlesamples/easypermissions
* */
private void testEasyPermission(){
String[] perms = {Manifest.permission.CAMERA};
if (EasyPermissions.hasPermissions(this, perms)) {
//todo something
LogUtil.i("testEasyPermission() : this camera permission is granted");
} else {
LogUtil.i("testEasyPermission() : this camera premission is denied , " +
"ready to request this permission");
EasyPermissions.requestPermissions(this, "你TM開相機(jī)權(quán)限啊!!",
REQUEST_PERMISSION_CAMERA_CODE, perms);
}
//自定義詢問框內(nèi)容部分,可試試看
// EasyPermissions.requestPermissions(
// new PermissionRequest.Builder(this, RC_CAMERA_AND_LOCATION, perms)
// .setRationale(R.string.camera_and_location_rationale)
// .setPositiveButtonText(R.string.rationale_ask_ok)
// .setNegativeButtonText(R.string.rationale_ask_cancel)
// .setTheme(R.style.my_fancy_style)
// .build());
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// Forward results to EasyPermissions
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@Override
public void onPermissionsGranted(int requestCode, @NonNull List perms) {
//省略switch requestCode
LogUtil.i("EasyPermission CallBack onPermissionsGranted() : "+perms.get(0)+
" request granted , to do something...");
//todo somthing
}
@Override
public void onPermissionsDenied(int requestCode, @NonNull List perms) {
//省略switch requestCode
//無權(quán)限,且被選擇"不再提醒":提醒客戶到APP應(yīng)用設(shè)置中打開權(quán)限
if (!ActivityCompat.shouldShowRequestPermissionRationale(instance, Manifest.permission.CAMERA)) {
LogUtil.e("EasyPermission CallBack onPermissionsDenied() : this " + perms.get(0) + " is denied " +
"and never ask again");
ToastUtil.showShort(instance, "拒絕權(quán)限,不再彈出詢問框,請前往APP應(yīng)用設(shè)置中打開此權(quán)限");
//todo nothing
}
//無權(quán)限,只是單純被拒絕
else {
LogUtil.e("EasyPermission CallBack onPermissionsDenied() : " + perms.get(0) + "request denied");
ToastUtil.showShort(instance, "拒絕權(quán)限,等待下次詢問哦");
//todo request permission again
}
}
3、RxPermissions:個(gè)人覺得更簡潔,最好在activity的onCreate()中使用哦
//build中依賴rxjava,rxandroid和rxpermissions
dependencies {
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
}
/**
* 測試:RxPermission
* https://github.com/tbruyelle/RxPermissions
* */
private void testRxPermission(){
RxPermissions rxPermissions = new RxPermissions(this); // where this is an Activity instance
rxPermissions
.requestEach(
Manifest.permission.CAMERA)
.subscribe(new Consumer() {
@Override
public void accept(Permission permission) throws Exception {
if (permission.granted) {
LogUtil.i("testRxPermission CallBack onPermissionsGranted() : "+permission.name+
" request granted , to do something...");
//todo somthing
}
else if (permission.shouldShowRequestPermissionRationale) {
LogUtil.e("testRxPermission CallBack onPermissionsDenied() : " + permission.name + "request denied");
ToastUtil.showShort(instance, "拒絕權(quán)限,等待下次詢問哦");
//todo request permission again
}
else {
LogUtil.e("testRxPermission CallBack onPermissionsDenied() : this " + permission.name + " is denied " +
"and never ask again");
ToastUtil.showShort(instance, "拒絕權(quán)限,不再彈出詢問框,請前往APP應(yīng)用設(shè)置中打開此權(quán)限");
//todo nothing
}
}
});
}
其他自定義彈出框UI,多個(gè)權(quán)限詢問等
總結(jié)
以上是生活随笔為你收集整理的原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android如何让自定义控件居中,An
- 下一篇: jq调用android方法,Androi