不想下載demo的直接複製文中代碼就可以用了
demo地址:http://download.csdn.net/detail/bnm52007/9801104
爲了減少重複代碼,就把請求權限方法全部放在activity的基類裏了,如果你不想放在基類裏也可以直接把本demo的方法複製出來單獨用。
此demo抽去了一個BaseActivity,請求權限時只需要傳入(“要請求的權限(多個權限就傳數組)”,requestCode,”用戶拒絕時提示的內容”)
MainActivity.super.Requestpermission(Manifest.permission.ACCESS_COARSE_LOCATION,99,"需要位置權限才能使用");
注意事項
如果targetSdkVersion 25 小於23那一開始默認安裝APP就會獲得權限
demo拒絕授權提示對話框使用的時默認樣式如果你的和demo的不同是因爲activity的主題不同,請在清單文件修改。
一般請求權限流程:
在清單文件加上要請求的權限,activity繼承OnRequestPermissionsResultCallback,重寫onRequestPermissionsResult方法,判斷是否請求成功
1、判斷是否大於或等於23
2、判斷是否已經有權限了
3、有就直接使用,沒有就去請求
一次請求多個權限時,遍歷數組看那權限沒有就去請求那個,不重複請求以具備的權限
//單個權限請求檢測,true不需要請求權限,false需要請求權限
public boolean isPermissionGranted(String permissionName) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
//判斷是否需要請求允許權限
int hasPermision = checkSelfPermission(permissionName);
if (hasPermision != PackageManager.PERMISSION_GRANTED) {
return false;
}
return true;
}
//多個權限請求檢測,返回list,如果list.size爲空說明權限全部有了不需要請求,否則請求沒有的
public List<String> isPermissionsAllGranted(String[] permArray) {
List<String> list = new ArrayList<>();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return list;
}
for (int i = 0; permArray != null && i < permArray.length; i++) {
//獲得批量請求但被禁止的權限列表
if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(permArray[i])) {
list.add(permArray[i]);
}
}
return list;
}
//單個權限請求
protected void Requestpermission(String s, int requestCode, String defeat) {
hint = defeat;
if (!TextUtils.isEmpty(s)) {
boolean granted = isPermissionGranted(s);
if (granted) { //有權限,調用方法
okPermissionResult(requestCode);
} else {
requestPermissions(new String[]{s}, requestCode);
}
}
}
//多個權限請求
protected void Requestpermission(String s[], int requestCode, String defeat) {
hint = defeat;
if (s.length != 0) {
List<String> perList = isPermissionsAllGranted(s);
if (perList.size() == 0) { //有權限,調用方法
okPermissionResult(requestCode);
} else {
requestPermissions(perList.toArray(new String[perList.size()]), requestCode);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
for (int i : grantResults) {
if (i != PackageManager.PERMISSION_GRANTED) { //有權限未通過
popAlterDialog();
return;
}
}
okPermissionResult(requestCode);
}
//有權限調用
protected void okPermissionResult(int requestCode) {
}
public void popAlterDialog() {
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage(hint)
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setPositiveButton("設置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//前往應用詳情界面
try {
Uri packUri = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packUri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} catch (Exception e) {
Toast.makeText(BaseActivity.this, "跳轉失敗", Toast.LENGTH_SHORT).show();
}
dialog.dismiss();
}
}).create().show();
}
使用方法
//定位,單個權限請求
findViewById(R.id.tv_location).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//參數說明:權限字符串,請求標記碼(requestCode),用戶拒絕權限提示內容
MainActivity.super.Requestpermission(Manifest.permission.ACCESS_COARSE_LOCATION,99,"需要位置權限才能使用");
}
});
//多個權限請求
findViewById(R.id.tv_allpeimission).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//參數說明:要請求的權限數組,請求標記碼(requestCode),用戶拒絕權限提示內容
String[] perms = {
Manifest.permission.CAMERA
, Manifest.permission.RECORD_AUDIO
, Manifest.permission.READ_EXTERNAL_STORAGE};
MainActivity.super.Requestpermission(perms,102,"需要相機,麥克風,存儲權限");
}
});
@Override
protected void okPermissionResult(int requestCode) {
if (requestCode==99){
Toast.makeText(this,"有位置權限了",Toast.LENGTH_SHORT).show();
}else if (requestCode==102){
Toast.makeText(this,"有相機,麥克風,存儲權限了",Toast.LENGTH_SHORT).show();
}
}