如果应用程序在manifest中声明了一个危险权限,并且他已经拥有该权限组的其他权限,那么该系统将直接允许其访问该权限,并且不与用户产生交互
我在文件清单中配置:
android:name="android.permission.CALL_PHONE">
一个Button点击的时候,进行拨号,当我写完红色部分的时候,根据提示生成了棕色部分的代码(该代码用于判断该程序是否具有拨号的的权限)。
我运行该程序到Android6.0的时候会提示没有权限,但我明明在配置清单中写了啊,其实这就需要我们运行时申请权限了
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + 10086));
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this,"没有权限",Toast.LENGTH_SHORT).show(); if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.CALL_PHONE)){ //如果之前有申请,但是被用户拒绝了,则返回true Toast.makeText(MainActivity.this,"之前有申请权限,但是被拒绝",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this,"没有申请过权限,---运行这里",Toast.LENGTH_SHORT).show(); } return; } startActivity(intent);
下面继续
如果你的应用程序没有所需要的权限,那么你必须要通过调用requestPermissions()方法来申请权限,该方法调用后,系统会立刻弹出权限申请询问对话框供供用户选择,在用户交互后,系统会立刻通过onRequestPermissionsResult()将结果返回给应用程序
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + 10086)); if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { //没有该权限的时候调用 if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.CALL_PHONE)){ //如果之前有申请,但是被用户拒绝了,则返回true }else{ //否则申请权限 //下面这句代码使得系统弹出对话框:要允许xxx程序打电话吗 ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);//第三个参数为请求码 } return; } startActivity(intent);
用户可以选择拒绝或者同意,那怎么处理呢,请看
//请求结果返回(拒绝或者返回) @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { //grant:发放 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //用户允许打电话 Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + 10086)); //下面这个是自动生成的(这里其实可以不用判断是否有该权限的了) if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { return; } startActivity(intent); }else{ //用户拒绝权限,如果被用户拒绝后,下次每次点击按钮的时候都会直接打印toast Toast.makeText(MainActivity.this,"你已经拒绝该权限,如果需要继续使用该功能,请允许该权限",Toast.LENGTH_SHORT).show(); } } }
或者可以在用户拒绝之后,再次点击按钮的时候弹出提示框提示
//判断权限的的方法 private void requestPermission(Activity mActivity,Context mcontext, String permisstion, int requestCode){ if(Build.VERSION.SDK_INT<23) return; if(ActivityCompat.checkSelfPermission(mcontext,permisstion)!=PackageManager.PERMISSION_GRANTED){ if(ActivityCompat.shouldShowRequestPermissionRationale(mActivity,permisstion)){ //如果之前用户拒绝了,那现在就应该提示一下用户 new AlertDialog.Builder(mcontext).setCancelable(false).setTitle("提示").setMessage("你之前已经拒绝该权限").setNegativeButton("我知道了", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); }else{ //申请权限 ActivityCompat.requestPermissions(mActivity,new String[]{permisstion},requestCode); } } }
Andnroid的运行时权限大概如此,如果在项目中应该做更详细的考虑,比如判断Android的版本号是否是6.0,在用户拒绝之后,下次再次点击的时候,应该弹出一个提示框等等,大家慢慢去探究吧