前言
Android 6.0 雖然相對于上一個(gè)版本 更新幅度較小,但也帶來了一寫全新的特性,這里就主要談一談 android 6.0--權(quán)限管理,開發(fā)過程中,就需要開發(fā)者去動態(tài)的權(quán)限申請妙蔗。
動態(tài)權(quán)限申請
Google從一開始就把權(quán)限分為兩類,一種是不涉及用戶隱私的權(quán)限:Normal Permission (普通權(quán)限)疆瑰,不需要用戶去主動授權(quán)眉反,在AndroidManifest.xml文件中聲明即可昙啄,另一種就是需要用戶授權(quán)才能使用的權(quán)限:Dangerous Permission(高危權(quán)限),同樣需要在AndroidManifest.xml中聲明寸五。
何時(shí)需要?jiǎng)討B(tài)權(quán)限申請
targetSdkVersion >=23 梳凛,只有當(dāng)我們把targetSdkVersion設(shè)置為大于等于23的時(shí)候,才會需要主動的申請權(quán)限播歼,如果不想啟用該方式伶跷,只要把targetSdkVersion 設(shè)置為 22或更小版本即可。
有哪些權(quán)限需要?jiǎng)討B(tài)申請
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
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
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.SENSORS
permission:android.permission.BODY_SENSORS
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.MICROPHONE
permission:android.permission.RECORD_AUDIO
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
以上就是需要主動申請的權(quán)限了也是前面提到的 Dangerous Permission(高危權(quán)限)秘狞,可以發(fā)現(xiàn)以上權(quán)限是一組一組出現(xiàn)的叭莫,android提供了這樣的分組,當(dāng)該組中任意一個(gè)權(quán)限授權(quán)成功烁试,默認(rèn)整組權(quán)限獲得授權(quán)雇初。當(dāng)然,在開發(fā)過程中减响,最好還是只對用到的權(quán)限做申請靖诗,畢竟后面的版本權(quán)限組也是會發(fā)生改變的。
申請流程
谷歌提供的官方demo
https://github.com/googlesamples/android-RuntimePermissions
這里我總結(jié)了一下流程:
在AndroidManifest文件中添加需要的權(quán)限支示。這個(gè)步驟和我們之前的開發(fā)并沒有什么變化刊橘,試圖去申請一個(gè)沒有聲明的權(quán)限可能會導(dǎo)致程序崩潰。
檢查權(quán)限是否已授權(quán)颂鸿,如果已經(jīng)授權(quán)促绵,則直接進(jìn)行想要的操作即可。
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
//未授權(quán)嘴纺,提起權(quán)限申請
} else {
//權(quán)限已授權(quán)败晴,功能操作
}
這里用到了一個(gè)方法,ActivityCompat.checkSelfPermission栽渴,用于判斷app是否已經(jīng)對某個(gè)權(quán)限授權(quán)尖坤,該方法只有兩個(gè)返回值
PackageManager.PERMISSION_DENIED //表示尚未授權(quán)
PackageManager.PERMISSION_GRANTED //表示已授權(quán)
- 如果尚未授權(quán),這里根據(jù)demo的流程 用到了
ActivityCompat.shouldShowRequestPermissionRationale 方法檢查闲擦,用戶是否曾經(jīng)拒絕過授權(quán)慢味,如果拒絕過,則開發(fā)者可以自定義內(nèi)容去提醒用戶該權(quán)限的用途墅冷,引導(dǎo)用戶授權(quán)纯路。
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
//用于開發(fā)者提示用戶權(quán)限的用途
} else {
//申請權(quán)限
}
- 如果是首次,則發(fā)起申請俺榆。
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA);
ActivityCompat.requestPermissions,權(quán)限申請装哆,這里出入的權(quán)限是一個(gè)數(shù)組集合罐脊,可以同時(shí)申請多個(gè)權(quán)限定嗓。
- 權(quán)限申請的回調(diào)處理。
首先需要實(shí)現(xiàn)接口ActivityCompat.OnRequestPermissionsResultCallback萍桌,注意一點(diǎn)宵溅,該接口必須由 Activity 或者其子類來實(shí)現(xiàn),如果該實(shí)現(xiàn)類是FragmentActivity 的子類則不需要再去實(shí)現(xiàn)上炎,因?yàn)镕ragmentActivity已經(jīng)實(shí)現(xiàn)了該接口恃逻,接下來重寫回調(diào)方法onRequestPermissionsResult。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
//判斷請求碼藕施,確定當(dāng)前申請的權(quán)限
if (requestCode == REQUEST_CAMERA) {
//判斷權(quán)限是否申請通過
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//授權(quán)成功
} else {
//授權(quán)失敗
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
回調(diào)方法的返回結(jié)果:
- requestCode :請求碼寇损,在提交申請權(quán)限時(shí),傳入的請求碼一致裳食。
- permissions:申請的權(quán)限數(shù)組矛市。
- grantResults:權(quán)限申請結(jié)果,與permissions 一一對用诲祸,表示各個(gè)權(quán)限的授權(quán)情況浊吏。
總結(jié)
關(guān)于android 6.0 的權(quán)限動態(tài)申請,雖然對于開發(fā)者來說救氯,比較麻煩找田,但從用戶角度來看,還是相當(dāng)好的着憨。