網上關于安卓動態(tài)權限申請的文章很多缚忧,但是畢竟眼花繚亂,所以下面我將根據自己的理解和在網上獲取到的信息對動態(tài)權限申請進行小小的總結杈笔,以便以后再次接觸安卓的時候能夠拿出來看闪水!
- 下面有幾組需要動態(tài)申請的權限,據說在每一組中蒙具,只需要成功申請一組即可球榆。申請需要在AndroidManifest.xml中添加對應的代碼:
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
- 需要注意,無論是動態(tài)權限申請還是其他權限的申請禁筏,都需要在AndroidManifest.xml文件中進行申請持钉。對于動態(tài)權限還需要在對應的java文件中用代碼進行動態(tài)權限的申請。接下來的內容主要是在.java文件中進行動態(tài)權限申請的代碼的介紹篱昔。
--今天沒有進行研究每强,我想得過幾天再進行研究,然后再進行總結,今天帶外甥仔忘記了^ _ ^ 早點休息吧(2018/1/17 23:55)
好了空执,現在繼續(xù)我們的總結浪箭,首先,先給一個鏈接脆烟,這個是google官方的關于運行時動態(tài)申請權限的代碼山林,在github上,喜歡的話可以fork到你的github賬戶中邢羔,點這里進行查看驼抹。
在下面我的介紹中,我也是基于官方文檔的拜鹤,因為規(guī)則是人家定的框冀,你必須遵循人家的標準∶舨荆總的來說明也,在java代碼中動態(tài)申請權限分為三個大的步驟,步驟一是檢查是否已經獲得了權限惯裕,步驟二則在步驟一沒有獲取到權限的時候進行動態(tài)權限的申請温数,步驟三則在回調函數中實現相應的操作。
下面我將以申請手機拍照的權限作為例子來總結分析:
在官方文檔的注釋當中蜻势,有幾句話是很重要的撑刺,我摘抄在下面:
* This Activity requests permissions to access the camera ({@link android.Manifest.permission#CAMERA})
* when the 'Show Camera' button is clicked to display the camera preview.
* First, permissions are checked if they have already been granted through {@link
* ActivityCompat#checkSelfPermission(Context, String)}.
* If permissions have not been granted, they are requested through
* {@link ActivityCompat#requestPermissions(Activity, String[], int)} and the return value checked
* in
* a callback to the {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback}
* interface.
這里表達的意思和我前面總結的三個步驟其實是一樣的。
接下來握玛,我們來看具體的代碼够傍,首先是一個showCamera()函數:
public void showCamera(View view) {
Log.i(TAG, "Show camera button pressed. Checking permission.");
// BEGIN_INCLUDE(camera_permission)
// Check if the Camera permission is already available.
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// Camera permission has not been granted.
requestCameraPermission();
} else {
// Camera permissions is already available, show the camera preview.
Log.i(TAG,
"CAMERA permission has already been granted. Displaying camera preview.");
showCameraPreview();
}
// END_INCLUDE(camera_permission)
}
在這部分代碼里面其實包含了我總結的兩個步驟,即步驟一檢查是否已經申請到了權限和步驟二如果沒有則進行權限的動態(tài)申請挠铲。檢查是否已經獲得了權限的代碼是if語句里面的判斷條件所示的代碼冕屯,在這里拿出來展示,以便看得更加清晰:
ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
其實原理很簡單拂苹,就是使用ActivityCompat.checkSelfPermission(Context, String)來判斷是否已經獲得了權限安聘,如果其返回值等于PackageManager.PERMISSION_GRANTED則已經獲得,否則沒有獲得權限醋寝。函數中的第一個參數是Context參數搞挣,即上下文,這個一般是this(fragment中則一般是getActivity())音羞,第二個參數是String類型的參數囱桨,表示的是申請的動態(tài)權限的類型,比如這里需要申請Camera的權限嗅绰,則是Manifest.permission.CAMERA舍肠,如果是其他搀继,則填上相應的即可,關于這個我會在文章后面進行一個總結翠语。
判斷完之后叽躯,如果已經獲得了權限,則我們可以用我們定義的方法打開相機肌括,完成相應的操作点骑;否則,我們要動態(tài)申請權限谍夭,即進行步驟二黑滴,我們用了另外一個函數來寫申請相機權限的過程,代碼如下:
private void requestCameraPermission() {
Log.i(TAG, "CAMERA permission has NOT been granted. Requesting permission.");
// BEGIN_INCLUDE(camera_permission_request)
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
// Provide an additional rationale to the user if the permission was not granted
// and the user would benefit from additional context for the use of the permission.
// For example if the user has previously denied the permission.
Log.i(TAG,
"Displaying camera permission rationale to provide additional context.");
Snackbar.make(mLayout, R.string.permission_camera_rationale,
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA);
}
})
.show();
} else {
// Camera permission has not been granted yet. Request it directly.
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA);
}
// END_INCLUDE(camera_permission_request)
}
上面的這個函數看似很復雜紧索,其實思路很清晰的袁辈,下面我就來分析分析:首先用ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)這個函數來檢測用戶是否設定了申請權限時彈出一些東西來提示是否允許使用相應的權限,如果是珠漂,那么就定制相應的提示晚缩,比如這里就使用了一個Snackbar來提醒用戶進行權限的申請;如果用戶沒有設定媳危,那么直接進行權限的申請荞彼,而不告知用戶。申請權限的函數是:
ActivityCompat.requestPermissions(Activity, String[], int)
第一個參數是Context待笑,第二個參數是申請的權限的字符串數組卿泽,因為有時需要申請的權限不止一個,第三個參數則是請求碼滋觉,這里已經定義了它的值:REQUEST_CAMERA = 0,關于不同的權限的請求碼將會在文章的后面進行總結齐邦。
最后椎侠,我們進行最后一個步驟,即實現回調函數措拇,只需要重寫onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)這個函數即可我纪,函數里面需要實現的內容我也展示出來,注意這里是以申請相機權限為例的:
if (requestCode == REQUEST_CAMERA) {
// BEGIN_INCLUDE(permission_result)
// Received permission result for camera permission.
Log.i(TAG, "Received response for Camera permission request.");
// Check if the only required permission has been granted
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Camera permission has been granted, preview can be displayed
Log.i(TAG, "CAMERA permission has now been granted. Showing preview.");
Snackbar.make(mLayout, R.string.permision_available_camera,
Snackbar.LENGTH_SHORT).show();
} else {
Log.i(TAG, "CAMERA permission was NOT granted.");
Snackbar.make(mLayout, R.string.permissions_not_granted,
Snackbar.LENGTH_SHORT).show();
}
// END_INCLUDE(permission_result)
}
在這個回調函數中丐吓,根據申請權限時返回的信息來判斷權限是否申請成功浅悉,從而用Snackbar來給用戶相應的提示,告訴用戶權限申請成功與否券犁。