Android必备知识(一):运行时的权限问题

目录

  • 静态申请权限
  • 动态申请权限

静态申请权限

为了获取网络与定位权限,于是在AndroidManifest.xml文件中添加了三句权限说明:

 <uses-permission android:name="android.permission.INTERNET"/>
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

android中的普通、危险权限需要静态申请,危险权限还需要动态申请。

动态申请权限

现在我们来学习一下Android6.0版本之后如何动态的申请权限:
CALL_PHONE 这个权限是编写拨打电话功能的时候需要声明的,是危险权限。首先在 AndroidManifest.xml 文件中声明如下权限:

<uses-permission android:name="android.permission.CALL_PHONE" />

接着再修改 MainActivity 中的代码,如下:

public class MainActivity extends AppCompatActivity {

   private Button makeCall;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);  
       init();
       makeCall.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.
                       CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                   ActivityCompat.requestPermissions(MainActivity.this, new
                           String[]{Manifest.permission.CALL_PHONE}, 1);
               } else {
                   call();
               }
           }
       });
   }

   private void init() {
       makeCall = (Button) findViewById(R.id.make_call);
   }

   private void call() {       //在用户已经授权的条件下,这个函数进行拨号操作
       try {
           Intent intent = new Intent(Intent.ACTION_CALL);
           intent.setData(Uri.parse("tel:10086"));
           startActivity(intent);
       }catch (SecurityException e){
           e.printStackTrace();
       }
   }

   public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
       switch (requestCode){
           case 1:
               if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                   call();
               }else{
                   Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT)
                           .show();
               }
               break;
           default:
       }
   }
}

第一步先判断用户是否授权,借助的是 ContextCompat.checkSelfPermission() 方法,它接收两个参数,第一个Context,第二个是具体的权限名;然后我们使用方法的返回值与 PackageManager.PERMISSION_GRSNTED 做比较,相等就说明用户已经授权,不等就没有授权。

如果已经授权就直接调用 call() 方法。如果没有授权的话,就需要调用 ActivityCompat.requestPermissions() 方法来向用户授权权限,它接收3个参数,第一个参数要求是Activity的实例,第二个参数是一个String数组,只需把要申请的权限名放在数组中即可,第三个是请求码,只要是唯一值就可以了。

调用完 requestPermissions() 方法后,系统会弹出一个权限申请的对话框,然后用户可以选择同意或者拒绝,不管哪种结果,最终都会回调到 onRequestPermissionsResult() 方法中,而授权的结果则会封装在 grantResults 参数中,它接收的第一个参数 requestCode 正好对应 requestPermissions() 中的第三个参数。

你可能感兴趣的:(Android必备知识(一):运行时的权限问题)