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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。