Android 6.0 的發(fā)布已經(jīng)將近一年了坚俗,其中引入了一個(gè)比較重要的新特性:?jiǎn)蝹€(gè)應(yīng)用的權(quán)限可以被管理了,用戶可以開啟或關(guān)閉一個(gè)應(yīng)用的任意一個(gè)權(quán)限帆啃。這就需要我們對(duì)這個(gè)特性進(jìn)行適配。
通過查看 Google 官網(wǎng)的教程 Requesting Permissions at Run Time ,可以快速的了解進(jìn)行權(quán)限申請(qǐng)摊唇,以及權(quán)限申請(qǐng)的處理方法。
權(quán)限申請(qǐng)
這里貼出請(qǐng)求權(quán)限的方法涯鲁,在需要權(quán)限的地方:
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
這里的代碼大部分都很好理解巷查,首先通過 ContextCompat.checkSelfPermission
方法判斷是否擁有某個(gè)權(quán)限有序,然后通過 ActivityCompat.shouldShowRequestPermissionRationale
方法判斷是否需要顯示請(qǐng)求權(quán)限解釋,最后通過 ActivityCompat.requestPermissions
方法顯示權(quán)限對(duì)話框讓用戶選擇是否允許使用該權(quán)限岛请。
這里 ActivityCompat.shouldShowRequestPermissionRationale
方法一開始我是比較疑惑的旭寿,經(jīng)過查資料和實(shí)際操作發(fā)現(xiàn)有以下幾種情況:
- 當(dāng)首次詢問用戶是否允許權(quán)限時(shí),返回 false 崇败;
- 當(dāng)用戶拒絕過一次權(quán)限時(shí)盅称,返回 true ,此時(shí)需要解釋該權(quán)限的作用后室;
- 當(dāng)用戶選擇不再顯示該對(duì)話框缩膝,并拒絕時(shí),返回 false 咧擂,同時(shí)對(duì)話框也不再顯示逞盆。
回調(diào)處理
接下來需要處理用戶選擇的結(jié)果,activity通過實(shí)現(xiàn) ActivityCompat.OnRequestPermissionsResultCallback
接口松申,重寫 onRequestPermissionsResult
方法云芦。
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
這里寫一下在實(shí)際使用過程中我遇到的坑,在 Google 的教程是適用于 activity 的贸桶,在 fragment 中使用時(shí)舅逸,我發(fā)現(xiàn)上述方法并沒有得到回調(diào),解決方法是在 fragment 中直接使用 fragment 的 requestPermissions
方法取代 ActivityCompat.requestPermissions
來顯示對(duì)話框皇筛,并重寫 fragment 中的 onRequestPermissionsResult
方法琉历,其他與上述一致。值得注意的是水醋,只要調(diào)用了 requestPermission 之后旗笔,不論用戶是允許,拒絕還是不在顯示拄踪,該方法都會(huì)被回調(diào)蝇恶。
內(nèi)容很簡(jiǎn)單,只要是講了使用中遇到的一些問題惶桐,在以后可能使用中可以得到避免撮弧,畢竟 6.0 的占有率會(huì)一直上升,6.0 權(quán)限的適配是需要做的姚糊。
危險(xiǎn)權(quán)限的列表和分組贿衍,還有完整的官方demo都在參考鏈接中。