Android6.0新特性,運行時權限。以打電話爲例。
步驟:
1、檢查權限:有就打電話;沒有就請求權限(如果之前用戶拒絕過,先提示爲啥需要這個權限)。
2、請求權限回來後:如果成功就打電話;沒成功就提示被拒絕(如果勾選了“不再詢問”則提示如何手動打開權限)。
代碼如下:
private void call() {
//檢查權限
if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
//沒有就去申請
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.CALL_PHONE)) {
// 用戶拒絕過這個權限了,應該提示用戶,爲什麼需要這個權限。
AlertDialog dialog = new AlertDialog.Builder(getContext())
.setMessage("解釋一下,因爲你要打電話,所以需要打電話權限。")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//繼續請求權限
requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, PERMISSIOINS_REQUEST_CODE_CALL);
}
}).create();
dialog.show();
}else {
//請求權限,fragment中運行時權限的特殊處理、在Fragment中申請權限、不要使用ActivityCompat.requestPermissions、直接使用Fragment的requestPermissions方法、否則會回調到Activity的 onRequestPermissionsResult
requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, PERMISSIOINS_REQUEST_CODE_CALL);
}
} else {
callPhone();
}
}
/**
* 申請權限的回調
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSIOINS_REQUEST_CODE_CALL) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
callPhone();
}
//拒絕後,再次彈框提示申請權限 ,若勾選“不再詢問”後點擊拒絕,會走此邏輯(此時shouldShowRequestPermissionRationale返回false)。
//因爲已經拒絕且不在提示,需要告訴用戶如何打開權限。
else if (!ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.CALL_PHONE)) {
AlertDialog dialog = new AlertDialog.Builder(getContext())
.setMessage("該功能需要訪問電話的權限,當前未打開權限! 打開權限的方法:設置-應用—權限。")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create();
dialog.show();
} else {
Toast.makeText(getContext(), "被拒絕了", Toast.LENGTH_SHORT).show();
}
}
}
/**
* 打電話.
* <p>
* 注意:
* android.intent.action.CALL需要在配置文件中添加撥號權限 且 點擊後直接撥號
* android.intent.action.DIAL只是調用撥號鍵盤,不用在文件中添加權限
*/
private void callPhone() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + "10086"));
startActivity(intent);
}
效果圖
1、第一次申請權限,用戶拒絕了,再次申請時 提示用戶爲啥需要這個權限,以免用戶勾選“不再詢問”且拒絕。
2、點擊確定後,申請權限的彈框 會有“不在詢問”的勾選框
3、勾選“不再詢問”後拒絕 的提示,告訴用戶怎麼打開權限。
比較好的文章及框架:
目前最流行的運行時權限請求框架PermissionsDispatcher、RxPermissions和easypermissions的使用和對比