动态权限需求原因
Android 6.0之前,权限在应用安装过程中只询问一次,以列表的形式展现给用户,然而大多数用户并不会注意到这些,直接就下一步了,应用安装成功后就会被赋予清单文件中的所有权限,应用就可以在用户不知情的情况下进行非法操作。
step1;检查版本
if(Build.VERSION.SDK_INT >= 23){
}
else
{
}
step2:检查权限
借助ContextCompat.checkSelfPermission( )方法
具体API
*public static int checkSelfPermission(@NonNull Context context, @NonNull String permission)
{
if (permission == null)
{
throw new IllegalArgumentException("permission is null");
}
return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());}*
step3:申请权限
通过调用ActivityCompat.requestPermissions()来向用户申请权限,该方法接受三个参数:Activity实例、String数组、请求码,唯一值即可,比如传入1
列子代码
AcitivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE}, 1);
step4:重写onRequestPermissionsResult()方法
系统调用完了requestPermission()方法之后,会弹出申请权限对话框,无论我们选择了同意或拒绝权限申请,都会回调到onRequestPermissionResult()方法,因此可以进行优化,比如点击了拒绝可以弹出吐司提示。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[]
grantResults) {
switch(requestCode){
case 1 ://根据你传入的唯一值即:1
if(permissions.length > 0 && permissions[0] == PackageManger.PERMISSION_GRANTED){
//具体同意申请权限后的动作
}
else{
Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
}
}
}
动态申请调用电话权限示例代码
protected void onCreat(Bundle savedIntnceState){
if(Build.VERSION.SDK_INT >= 23){
int result = ContextCompat.checkSelfPermission(MainActivity.this, Mainfest.permission.CALL_PHONE);
if(result != PackageManager.Permission_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
}else{
call();
}
}else{
//6.0系统才增加的权限申请
call();
}
}
public void call(){
try{
Intent intent = new Intent(Intent.Action_CALL);
intent.setData(Uri.prase("tel:10086"));
startActivity(intent);
}else{
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[]
grantResults) {
switch(requestCode){
case 1 :
if(permissions.length > 0 && permissions[0] == PackageManger.PERMISSION_GRANTED){
call();
}
else{
Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
}
}
}