日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)

發布時間:2024/8/5 Android 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:動態權限管理是Android6.0(Build.VERSION_CODES.M = Api23)推出的,提醒用戶當前APP所需要的權限,防止濫用。這些權限一般分為三種:(1)普通權限:直接manifest清單文件中寫上注冊就行了 (2)危險權限:需要動態申請 (3)特殊權限:此處暫不說明。

注意:這里我們就按照原生,和git上比較出名的第三方權限管理工具,EasyPermissions和RxPermissions

一、參考

二、異常

異常:java.lang.SecurityException: getDeviceId: Neither user 10127 nor current process has android.permission.READ_PHONE_STATE.

解釋:走到方法getDeviceId這里異常,缺失權限:READ_PHONE_STATE,先檢查manifest.xml清單文件里有沒有,沒有補上,如果有,那么這個權限就得動態獲取了。

三、流程

1、第一次詢問權限 -》允許權限(再次詢問同樣權限也不會彈框,已注冊)

2、第一次詢問權限-》拒絕權限-》再次詢問權限-》允許權限(再次詢問同樣權限也不會彈框,已注冊)

3、第一次詢問權限-》拒絕權限-》再次詢問權限-》不再詢問(再次詢問同樣權限也不會有彈框,直接拒絕)

--------------------幾張圖片說明--------------------

first_request.png

not_first_request.png

not_first_request_and_not_ask_again.png

四、實例

1、原生,比較長且繁瑣,先理解下

/**

* 測試:原生動態權限管理

* */

private void testOrgPermission(){

//判斷當前系統是否高于或等于6.0

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

//已注冊權限

if (ContextCompat.checkSelfPermission(instance, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {

//todo something

LogUtil.i("testOrgPermission() : this camera permission is granted");

}

//未注冊權限,申請權限

else {

// v4向下兼容:詢問權限(這里可以一個,也可以多個)

// 拒絕權限后再次詢問

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);

}

}

//當前系統小于6.0,無需動態申請權限

else {

//todo something

}

}

/**

* 詢問權限的回調函數

* */

@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];//相機權限

boolean cameraGranted = cameraResult == PackageManager.PERMISSION_GRANTED;//拍照權限

//注冊權限

if (cameraGranted) {

LogUtil.i("onRequestPermissionsResult() : "+permissions[0]+

" request granted , to do something...");

//todo something

}

//拒絕注冊權限

else {

//無權限,且被選擇"不再提醒":提醒客戶到APP應用設置中打開權限

if(!ActivityCompat.shouldShowRequestPermissionRationale(instance,Manifest.permission.CAMERA)){

LogUtil.e("onRequestPermissionsResult() : this "+permissions[0]+" is denied " +

"and never ask again");

ToastUtil.showShort(instance,"拒絕權限,不再彈出詢問框,請前往APP應用設置中打開此權限");

//todo nothing

}

//無權限,只是單純被拒絕

else{

LogUtil.e("onRequestPermissionsResult() : "+permissions[0]+"request denied");

ToastUtil.showShort(instance,"拒絕權限,等待下次詢問哦");

//todo request permission again

}

}

break;

default:break;

}

}

2、EasyPermissions:挺簡潔的

//build中依賴easypermissions

dependencies {

implementation 'pub.devrel:easypermissions:1.1.2'

}

#notice:這里要實現回調接口 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開相機權限啊!!",

REQUEST_PERMISSION_CAMERA_CODE, perms);

}

//自定義詢問框內容部分,可試試看

// 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

//無權限,且被選擇"不再提醒":提醒客戶到APP應用設置中打開權限

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, "拒絕權限,不再彈出詢問框,請前往APP應用設置中打開此權限");

//todo nothing

}

//無權限,只是單純被拒絕

else {

LogUtil.e("EasyPermission CallBack onPermissionsDenied() : " + perms.get(0) + "request denied");

ToastUtil.showShort(instance, "拒絕權限,等待下次詢問哦");

//todo request permission again

}

}

3、RxPermissions:個人覺得更簡潔,最好在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, "拒絕權限,等待下次詢問哦");

//todo request permission again

}

else {

LogUtil.e("testRxPermission CallBack onPermissionsDenied() : this " + permission.name + " is denied " +

"and never ask again");

ToastUtil.showShort(instance, "拒絕權限,不再彈出詢問框,請前往APP應用設置中打開此權限");

//todo nothing

}

}

});

}

其他自定義彈出框UI,多個權限詢問等

總結

以上是生活随笔為你收集整理的原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。