Android開發中當targetSDKVersion 的值大於22時候,就會涉及到運行時權限的問題。有的應用程序會在剛進入App的首頁的時候彈出提示框讓用戶選擇允許還是拒絕,有的應用程序會在需要這個權限的地方彈出提示框讓用戶選擇,當用戶選擇允許的時候還好,但當用戶選擇拒絕的時候,當再次進入App或者某個頁面的時候就不會再一次彈出提示框讓用戶選擇,這就比較尷尬了,有的手機得不到某個權限的時候會導致App崩潰,例如getDeviceId的時候需要READ-PHONE_STATE這個權限,在vivo ,oppo,魅族的手機上是可以得到這個權限的,但在小米的機型上需要動態申請纔可以得到。就會導致程序在小米的手機上不能兼容。下面說一下我的解決方法。
1.進入App或進入某個頁面的onResume生命週期裏先檢查是否有這個權限。(這裏以進入登錄頁面爲例),沒有這個權限的時候去申請這個權限彈出提示框。
2.彈出提示框後如果用戶點擊允許就可以結束這個邏輯了,萬事大吉。
用戶點擊了拒絕後,繼續操作在需要特殊權限的地方用try catch 語句處理,當走到catch裏的時候彈出自己寫的提示框,提示用戶跳轉到設置頁面手動開啓所需要的權限。
代碼如下:
1.
@Override
public void onResume() {
super.onResume();
//檢查是否有讀取手機信息的權限
int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
// 沒有這個權限去請求
requestReadPhonePermission();
} else {
//TODO
}
}
2.
private void requestReadPhonePermission() {
//shouldShowRequestPermissionRationale 這個方法是提示用戶請求權限的理由
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), android.Manifest.permission.READ_PHONE_STATE)) {
//在這裏面處理需要權限的代碼
} else {
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_PHONE_STATE}, 0);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 0:
if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
//TODO
Log.i("fkajfk", "走了這個log");
}
break;
default:
break;
}
}
3.
/**
* 提示用戶的 dialog
*/
protected void showMissingPermissionDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("提示");
builder.setMessage("當前應用缺少獲取手機信息權限。\n\n請點擊\"設置\"-\"權限管理\"-打開所需權限。");
// 拒絕, 退出應用
builder.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.i("info", "8--權限被拒絕,此時不會再回調onRequestPermissionsResult方法");
}
});
builder.setPositiveButton("設置",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.i("info", "4,需要用戶手動設置,開啓當前app設置界面");
startAppSettings();
}
});
builder.setCancelable(false);
builder.show();
}
4.
/**
* 打開 App設置界面
*/
private void startAppSettings() {
Intent intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getActivity().getPackageName()));
startActivity(intent);
}
5.//在try catch 的異常裏調用 showMissingPermissionDialog();
try {
//正常做操作
}catch (Exception e){
showMissingPermissionDialog();
}
附上兩張截圖: