Android M 權限設定方式
http://developer.android.com/intl/zh-tw/training/permissions/requesting.html
- App所使用的權限,改成當App執行時給予而非安裝時詢問。
- User可更彈性控制權限,假設App需要Camera和location兩個權限,User可只給予Camera(6.0之前的版本只能一次全部給予)
- 權限將分為Normal和Dangerous兩類
- Normal:對於User沒有直接的隱私問題,當宣告在manifest後將會自動給予權限
- Dangerous:需要由User主動給予權限才可使用
- 在5.0以前的版本,若user拒絕某些dangerous的權限,app將無法安裝
- 在6.0以後的版本,app將可安裝,在執行後需要權限時,APP將要求user給予
Check For Permissions
- 藉由下述code,確認是否擁有權限
- Success:PackageManager.PERMISSION_GRANTED
- Denied:PackageManager.PERMISSION_DENIED
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);
- 請求權限的Dialog無法客制化
- Google提供shouldShowRequestPermissionRationale()函式,將顯示出Dialog詢問user,並告知需要此權限的原因,若User選擇「Don’t ask againg」,此methods將永遠return false
- requestPermissions()則是只詢問user是否給予權限,開發者無法修改此dialog之內容,當user同意後,將會call onRequestPermissionsResult()的callback methods
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { // 向User解釋要求權限之原因,請user同意 } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); }
Handle the permissions request response
- 當user有回應權限之請求後,將會call onRequestPermissionsResult()的callback methods
- App將需要Override此methods,以便處理user的回應
@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 } }
- 當App需要多個Dangerous的權限,例如一開始需要READ_CONTACTS,而之後需要WRITE_CONTACTS,其屬於同一個group,第二個WRITE_CONTACTS就不需要再詢問
Permission Group可參閱:http://developer.android.com/intl/zh-tw/guide/topics/security/permissions.html#perm-groups
- 倘若User已經勾選不再詢問,將會回傳上一次的結果(always true or false),詢問的Dialog不一定會出現
文章標籤
全站熱搜

感謝分享!