【舉例】Android動態申請許可權
阿新 • • 發佈:2018-11-26
寫在前面:對於新版本的Android,部分許可權必須手動向使用者發起請求並獲得允許後才能使用。關於這一部分的基礎知識,這裡就不詳述。大家可以自行百度去獲取。
相關知識:
【舉例】Android自定義Dialog——做出“確定/取消”的選擇
還是一貫的風格,直接上程式碼。
1. 與舊版本一樣,所有需要的許可權需要手動宣告
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在這些許可權中,CAMERA 、RECORD_AUDIO 和 WRITE_EXTERNAL_STORAGE 需要動態申請。
2. 動態申請許可權
//一個整形常量
public static final int MY_PERMISSIONS_REQUEST = 3000 ;
//定義一個list,用於儲存需要申請的許可權
ArrayList<String> permissionList = new ArrayList<String>();
permissionList.add(Manifest.permission.CAMERA);
permissionList.add(Manifest.permission.RECORD_AUDIO);
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
//呼叫封裝好的申請許可權的方法
private void checkAndRequestPermissions(ArrayList<String> permissionList) {
ArrayList<String> list = new ArrayList<>(permissionList);
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String permission = it.next();
//檢查許可權是否已經申請
int hasPermission = ContextCompat.checkSelfPermission(this, permission);
if (hasPermission == PackageManager.PERMISSION_GRANTED) {
it.remove();
}
}
/**
*補充說明:ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO);
*對於原生Android,如果使用者選擇了“不再提示”,那麼shouldShowRequestPermissionRationale就會為true。
*此時,使用者可以彈出一個對話方塊,向用戶解釋為什麼需要這項許可權。
*對於一些深度定製的系統,如果使用者選擇了“不再提示”,那麼shouldShowRequestPermissionRationale永遠為false
*
*/
if (list.size() == 0) {
return;
}
String[] permissions = list.toArray(new String[0]);
//正式請求許可權
ActivityCompat.requestPermissions(this, permissions, AppConstant.MY_PERMISSIONS_REQUEST);
}
3. 在本Activity中重寫 onRequestPermissionsResult() 方法
//不管許可權申請成功與否,都會呼叫該方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case AppConstant.MY_PERMISSIONS_REQUEST: {
// If request is cancelled, the result arrays are empty.
int length = grantResults.length;
boolean re_request = false;//標記位:如果需要重新授予許可權,true;反之,false。
for (int i = 0; i < length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "許可權授予成功:" + permissions[i]);
} else {
Log.e(TAG, "許可權授予失敗:" + permissions[i]);
re_request = true;
}
}
if (re_request) {
//彈出對話方塊,提示使用者重新授予許可權
//關於彈出自定義對話方塊,可以檢視本博文開頭的知識擴充套件
final YesOrNoDialog permissionDialog = new YesOrNoDialog(mContext);
permissionDialog.setCanceledOnTouchOutside(false);
permissionDialog.setMeesage("請授予相關許可權,否則程式無法執行。\n\n點選確定,重新授予許可權。\n點選取消,立即終止程式。\n");
permissionDialog.setCallback(new YesOrNoDialog.YesOrNoDialogCallback() {
@Override
public void onClickButton(YesOrNoDialog.ClickedButton button, String message) {
if (button == YesOrNoDialog.ClickedButton.POSITIVE) {
permissionDialog.dismiss();
//此處需要彈出手動修改許可權的系統介面
checkAndRequestPermissions(permissionList);
} else if (button == YesOrNoDialog.ClickedButton.NEGATIVE) {
permissionDialog.dismiss();
TestActivity.this.finish();
}
}
});
permissionDialog.show();
}
break;
}
default:
break;
}
}
抓住Demo一隻:
為了方便以後呼叫,本人已經將上述方法封裝到了.aar檔案中。以後呼叫時,只需要匯入第三方包即可。
歡迎大家補充交流。