1. 運行時獲得權限:
從androi 6.0開始,不再是安裝應用時用戶確定獲得全部的權限.而是在使用軟件過程中需要該權限時,彈出對話框讓用戶選擇權限.不僅如此,用戶選擇權限後還可以關閉。
2. 檢查是否獲得權限:
通過 ContextCompat.checkSelfPermission(context,permission)方法,方法返回值爲 PackageManager.PERMISSION_GRANTED or PackageManager.PERMISSION_DENIED
int permissionCheck = ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_CALENDAR);
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(PermissionActivity.this, "hava this permission", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(PermissionActivity.this, "no this permission", Toast.LENGTH_SHORT).show();
}
3. 請求權限:
通過ActivityCompat.requestPermissions(activity,permissions,requestCode)第二個參數是一個String數組,第三個參數是請求碼便於在onRequestPermissionsResult 方法中根據requestCode進行判斷.
ActivityCompat.requestPermissions(PermissionActivity.this,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
4. 請求權限後的回調:
請求權限後會回調onRequestPermissionsResult方法,在activity中重寫onRequestPermissionsResult(requestCode,permissions,grantResults)方法 grantResults是int類型的數組每個值爲PackageManager.PERMISSION_GRANTED or PackageManager.PERMISSION_DENIED 分別對應permissions的每個請求.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull 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) {
} else {
}
}
}
}
5. 告訴用戶爲何需要權限:
ActivityCompat.shouldShowRequestPermissionRationale(activity,permission) 這個方法是在用戶拒絕權限後返回true. 也就是說:用戶第一次點擊一個需要權限的地方,該方法返回false(因爲用戶沒拒絕~),當用戶拒絕掉該權限,下次點擊此權限處,該方法會返回true.可在裏面進行對該權限的說明,然後彈出權限讓用戶選擇,並且對話框有don't ask again選項.
@OnClick(R.id.btn_check)
public void onClick() {
//判斷是否有權限
if (ContextCompat.checkSelfPermission(PermissionActivity.this,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
//當用戶拒絕掉權限時.
if (ActivityCompat.shouldShowRequestPermissionRationale(PermissionActivity.this,
Manifest.permission.READ_CONTACTS)) {
Toast.makeText(PermissionActivity.this, "true", Toast.LENGTH_SHORT).show();
AlertDialog dialog = new AlertDialog.Builder(this).setTitle("該權限保證手機不會爆炸^ ^").setPositiveButton("我需要此權限!", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(PermissionActivity.this,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
}).setNegativeButton("炸吧炸吧~", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(PermissionActivity.this, "準備爆炸了", Toast.LENGTH_SHORT).show();
}
}).show();
} else {
Toast.makeText(PermissionActivity.this, "false", Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(PermissionActivity.this,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
}
}
6.用戶選擇do't ask again 後
ActivityCompat.shouldShowRequestPermissionRationale(activity,permission) 方法一直返回false,並且ActivityCompat.requestPermissions不會彈出對話框,系統直接deny,並回調onRequestPermissionsResult方法.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull 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) {
} else {
showDialog();
// Toast.makeText(PermissionActivity.this, "request false", Toast.LENGTH_SHORT).show();
}
}
}
}
private void showDialog() {
AlertDialog dialog = new AlertDialog.Builder(this).setTitle("還可以手動開啓哦~").setMessage("可以前往設置->app->myapp->permission打開").setPositiveButton("確定!", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
}
7. 用戶接受權限
8.補充
android權限有normal和dangerous兩種 normal系統會自動給予權限,dangerous需要用戶選擇.Normal and Dangerous Permissions
用戶手動開啓權限: