Android基础之权限

一、分类

  1. 普通权限
    指不会直接威胁到用户安全和隐私的权限,对于这部分权限申请,系统自动帮我们进行授权,如网络状态查看权限
  2. 危险权限
    表示那些可能会触及用户隐私或者对设备安全性造成影响的权限,如获取设备联系人,定位设备的地理位置等。这部分权限必须手动授权

二、危险权限表
Android基础之权限
除了危险权限以外,剩余的都是普通权限
属于这张表达的权限,就需要运行时权限处理
不在这张表的中,只需要在Manifest.xml中声明一下权限即可
每个权限属于一个权限组,只要其中一个被同意了,整个都会被同意

三、实例(打电话)
MainActivity.java

package com.example.runtimepermissiontest;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private Button makeCall;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        makeCall=(Button)findViewById(R.id.make_call);
        makeCall.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                //通过ContextCompat.checkSelfPermission()函数判断是否授权
                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 call(){
        try{
            Intent intent=new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:10086"));
            startActivity(intent);
        }catch (SecurityException e){
            e.printStackTrace();
        }
    }

    @Override
    //requestPermissions的结果会回调到下面的函数中,其中第三个参数就是授权结果
    public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
        switch (requestCode){
            case 1://1”就是刚才的请求码
                if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    call();
                }
                else{//不同意授权的情况
                    Toast.makeText(this,"你拒绝了这个授权",Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
    }
}

在AndroidManifest.xml中注册

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

结果:

Android基础之权限