動態權限

1.場景分析

我在android7.0上使用掃描功能的時候,因爲app沒有授權照相機權限,出現了下圖的情況

 

所以android6.0+使用掃描功能之前,必須先獲取運行時權限

</br>

2.關於運行時權限

Android6.0+添加了運行時權限分爲兩類:
一類是Normal Permissions,這類權限不涉及個人隱私,不需要用戶進行授權,比如手機震動,訪問網絡;
一類是Dangerous Permissions,這類權限涉及個人隱私,需要用戶進行授權,比如讀取SD卡,訪問通訊錄等。

收集了一下,下圖是Dangerous Permissions

Dangerous Permissions

 

中文翻譯過來如下:

group:android.permission-group.CALENDAR 日曆
  permission:android.permission.READ_CALENDAR 讀取日曆
  permission:android.permission.WRITE_CALENDAR 寫入日曆

group:android.permission-group.CAMERA 照相機
  permission:android.permission.CAMERA

group:android.permission-group.CONTACTS 通訊錄方面
  permission:android.permission.WRITE_CONTACTS 寫入通訊錄
  permission:android.permission.GET_ACCOUNTS 訪問通訊錄權限
  permission:android.permission.READ_CONTACTS 讀取通訊錄

group:android.permission-group.LOCATION 位置
  permission:android.permission.ACCESS_FINE_LOCATION 獲取位置
  permission:android.permission.ACCESS_COARSE_LOCATION 獲取粗略定位

group:android.permission-group.MICROPHONE 擴音器;麥克風
permission:android.permission.RECORD_AUDIO 錄音

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 使用SIP
  permission:android.permission.PROCESS_OUTGOING_CALLS 過程輸出調用   permission:com.android.voicemail.permission.ADD_VOICEMAIL 添加語音信箱

group:android.permission-group.SENSORS 傳感器
  permission:android.permission.BODY_SENSORS 體傳感器
 
group:android.permission-group.SMS 信息
 permission:android.permission.READ_SMS 讀取信息   
  permission:android.permission.RECEIVE_WAP_PUSH 收到WAP推送
  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.STORAGE 存儲
  permission:android.permission.READ_EXTERNAL_STORAGE 讀取外部存儲器  
  permission:android.permission.WRITE_EXTERNAL_STORAGE 寫外部存儲器

可以注意到Dangerous Permissions是有分組的。app運行在Android 6.0+的機器上,如果你申請某個Dangerous Permissions,假設你已經授權了一個與你現在申請的是同一組的Dangerous Permissions,那麼系統會自動授權,不需要用戶再去點擊授權。
舉個栗子:比如你對READ_EXTERNAL_STORAGE (讀取外部存儲器) 已經授權了,那麼當你再申請WRITE_EXTERNAL_STORAGE (寫外部存儲器時),系統會直接授權通過,因爲他們都在permission-group.STORAGE裏。

3.RxPermissions獲取運行時權限

準備工作:
因爲要用到RxPermissions,所以先加入依賴,而RxPermissions又屬於rx系列,所以也要加入對rxjava的依賴

compile 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'
compile 'io.reactivex:rxjava:1.1.3'

然後在minifast加入所需要的Dangerous Permissions,例如:

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />

然後返回我們的Activity,用RxPermissions我們可以申請單個或者申請多個權限

        //請求單個權限
        btn_request.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //這個請求事件我寫在點擊事件裏面,
                //點擊button之後RxPermissions會爲我們申請運行時權限
                RxPermissions.getInstance(MainActivity.this)
                        .request(Manifest.permission.READ_CALENDAR)//這裏填寫所需要的權限
                        .subscribe(new Action1<Boolean>() {
                            @Override
                            public void call(Boolean aBoolean) {
                                if (aBoolean) {//true表示獲取權限成功(注意這裏在android6.0以下默認爲true)
                                    Log.i("permissions", Manifest.permission.READ_CALENDAR + ":" + 獲取成功);
                                } else {
                                    Log.i("permissions", Manifest.permission.READ_CALENDAR + ":" + 獲取失敗);
                                }
                            }
                        });
            }
        });

點擊button,彈出對話框

 

點擊禁止,打印log

點擊始終允許,打印log

下面申請多個權限

//同時請求多個權限
RxPermissions.getInstance(MainActivity.this)
                        .request(Manifest.permission.RECEIVE_MMS,
                                Manifest.permission.READ_CALL_LOG)//多個權限用","隔開
                        .subscribe(new Action1<Boolean>() {
                            @Override
                            public void call(Boolean aBoolean) {
                                if (aBoolean) {
                                    //當所有權限都允許之後,返回true
                                    Log.i("permissions", "btn_more_sametime:" + aBoolean);
                                } else {
                                    //只要有一個權限禁止,返回false,
                                    //下一次申請只申請沒通過申請的權限
                                    Log.i("permissions", "btn_more_sametime:" + aBoolean);
                                }
                            }
                        });

同時請求多個權限

//分別申請多個權限
RxPermissions.getInstance(MainActivity.this)
                          //分別申請多個權限時,使用requestEach
                        .requestEach(Manifest.permission.ACCESS_FINE_LOCATION,
                                Manifest.permission.RECORD_AUDIO,
                                Manifest.permission.CAMERA)
                        .subscribe(new Action1<Permission>() {
                            @Override
                            public void call(Permission permission) {
                                if (permission.name.equals(Manifest.permission.ACCESS_FINE_LOCATION)) {
                                     //當ACCESS_FINE_LOCATION權限獲取成功時,permission.granted=true
                                    Log.i("permissions", Manifest.permission.ACCESS_FINE_LOCATION + ":" + permission.granted);
                                }
                                if (permission.name.equals(Manifest.permission.RECORD_AUDIO)) {
                                     //當RECORD_AUDIO 權限獲取成功時,permission.granted=true
                                    Log.i("permissions", Manifest.permission.RECORD_AUDIO + ":" + permission.granted);
                                }
                                if (permission.name.equals(Manifest.permission.CAMERA)) {
                                     //當CAMERA權限獲取成功時,permission.granted=true
                                    Log.i("permissions", Manifest.permission.CAMERA + ":" + permission.granted);
                                }
                            }
                        });

分別申請多個權限

最後放出RxPermissions的github鏈接:
https://github.com/tbruyelle/RxPermissions/tree/4c4d4e1e84ad1fcf390342c493c8ed09b5e613ca



作者:四會歌神陳子豪
鏈接:https://www.jianshu.com/p/314e9e27592f
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

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