Android 6.0以上运行权限及RxPermissions的使用
傳說Android 7.0的市場占有率終于1%了,Android 6.0基本上人人有了。這個時候,我不得不把軟件開發的SDK目標版本提升到了23。這是就要考慮實現權限的動態分配了。基于我項目用使用了RxJava,所以我就選擇了RxPermissions框架來實現權限的動態分配。
一、了解權限
??權限分兩種:普通權限、危險權限。普通權限在AndroidManifest.xml聲明就可以了,危險權限在AndroidManifest.xml聲明之后,還需要在軟件運行的時候,動態的獲取。目前危險權限一共有26個,其他的都是普通權限。
??Dangerous Permissions 共有26個:
group:android.permission-group.CAMERA
??permission:android.permission.CAMERA
group:android.permission-group.SENSORS
??permission:android.permission.BODY_SENSORS
group:android.permission-group.MICROPHONE
??permission:android.permission.RECORD_AUDIO
group:android.permission-group.CALENDAR
??permission:android.permission.READ_CALENDAR
??permission:android.permission.WRITE_CALENDAR
group:android.permission-group.LOCATION
??permission:android.permission.ACCESS_FINE_LOCATION
??permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
??permission:android.permission.READ_EXTERNAL_STORAGE
??permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.CONTACTS
??permission:android.permission.WRITE_CONTACTS
??permission:android.permission.GET_ACCOUNTS
??permission:android.permission.READ_CONTACTS
group:android.permission-group.SMS
??permission:android.permission.READ_SMS
??permission:android.permission.RECEIVE_WAP_PUSH
??permission:android.permission.RECEIVE_MMS
??permission:android.permission.RECEIVE_SMS
??permission:android.permission.SEND_SMS
??permission:android.permission.READ_CELL_BROADCASTS
group:android.permission-group.PHONE
??permission:android.permission.READ_CALL_LOG
??permission:android.permission.READ_PHONE_STATE
??permission:android.permission.CALL_PHONE
??permission:android.permission.WRITE_CALL_LOG
??permission:android.permission.USE_SIP
??permission:android.permission.PROCESS_OUTGOING_CALLS
??permission:com.android.voicemail.permission.ADD_VOICEMAIL
android.permission.ANSWER_PHONE_CALLS
??一共九大分組,每個分組只要申請其中一個權限,其他權限都可以獲得。最后一個是Android 8.0新添加的權限,是限制接聽來電的權限。如果想查看其他權限可以查看訪問權限API。
二、RxPermissions
在GitHub上的地址是:https://github.com/tbruyelle/RxPermissions。
??現在主要有兩個分支,如下圖:
??2.x分支是基于RxJava2的源碼。master是基于Rxjava的源碼。不管是RxJava、RxJava2對RxPermissions的使用沒有影響,只是導入的依賴不一樣。
??RxJava、RxJava2導入的依賴分別是:
RxPermissions的使用
1、minSdkVersion 必須大于等于11.
2、在build.gradle中配置。
如果沒有的話,添加這個。
android {repositories {jcenter() // If not already there} }再添加依賴:
基于RxJava
基于RxJava2
dependencies {compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar' }3、初始化
RxPermissions rxPermissions = RxPermissions.getInstance(this);4、使用方法
申請一個權限的方法:
// 假如申請調用系統拍照 rxPermissions.request(Manifest.permission.CAMERA).subscribe(new Subscriber<Boolean>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(Boolean aBoolean) {// aBoolean:true開啟成功 false開啟失敗} });申請多個權限的方法:
rxPermissions.request(Manifest.permission.CAMERA,Manifest.permission.ACCESS_FINE_LOCATION).subscribe(new Subscriber<Boolean>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(Boolean aBoolean) {// aBoolean:true開啟成功 false開啟失敗// 只要有一個權限申請失敗,就返回false} });申請權限并查看申請結果的詳細信息:
rxPermissions.requestEach(permissions).subscribe(new Subscriber<Permission>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(Permission permission) {if (permission.granted) {Log.e("申請成功:",permission.name);} else if (permission.shouldShowRequestPermissionRationale) {Log.e("申請取消:",permission.name);} else {Log.e("申請失敗:",permission.name);}}});??這個方法,是實現返回每個權限申請的結果。返回的是Permission 類。包含權限申請結果,包含:permission.granted表示申請成功;permission.shouldShowRequestPermissionRationale表示申請取消;如果這兩個都不是,表示申請被拒絕,只能在設置界面手動開啟。跳轉至系統設置界面的方法:
/*** 獲取應用詳情頁面intent*/ private void getAppDetailSettingIntent() {Intent localIntent = new Intent();localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (Build.VERSION.SDK_INT >= 9) {localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");localIntent.setData(Uri.fromParts("package", getPackageName(), null));} else {localIntent.setAction(Intent.ACTION_VIEW);localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");localIntent.putExtra("com.android.settings.ApplicationPkgName", getPackageName());}startActivity(localIntent);mContext.overridePendingTransitionEnter(); }?? github還提到了ensure、ensureEach 方法。也分別對應了返回的簡單結果和詳細結果。這兩個方法是實現view綁定權限請求的框架RxBinding時使用的,RxBinding是要結合RxPermission使用的。RxBinding的GitHub地址
??權限的請求方法,最好寫在onCreate()方法里,這樣在啟動界面的時候,會先檢測權限信息。
總結
以上是生活随笔為你收集整理的Android 6.0以上运行权限及RxPermissions的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黄金如何开户
- 下一篇: 滴滴成都组建网约车保障车队,预备300台