《第一行代码》第七章(运行时权限)


1.内容提供器的作用:在不同的应用程序之间实现数据的共享功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性,目前使用内容提供器是Android实现跨程序共享数据的标准方式

2.在学习内容提供器之前,需要了解Android系统的权限,权限机制从系统的第一个版本中就已经出现,目的是为了保护用户安全和隐私,而在Android 6.0 之后,引入了运行时权限这个功能,对于普通权限而言,系统会自动的帮助我们授权,而对于另外的(9组24个)危险权限,则需要用户手动点击授权

3.关于权限的声明,需要在AndroidManifest.xml文件中声明例如:

<uses-permission android:name="android.permission.READ_CONTACTS"/>		//读取联系人的权限

<uses-permission android:name="android.permission.CALL_PHONE" />		//拨打电话的权限(在6.0之后需要运行时授权处理)

手动授权的代码修改如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button makecall = (Button) findViewById(R.id.make_call);
        makecall.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
			/*首先要对用户是否已经授权进行判断,使用的是ContextCompat.checkSelfPermission()方法,它需要传入两个参数,一个是Context,另一个是具
			体的权限名称开,比如这里的打电话的权限,将返回值与后面的PackageManager.PERMISSION_GRANTED进行比较,相等的话即表示已经授权
			如果用户没有授权的话就通过ActivityCompat.requestPermissions()方法来向用户申请授权,这里需要3个参数,第一个是需要授权的Activity实例
			第二个是一个String[]类型的表示权限名(将权限名放在这个数组中即可),第三个参数是请求码,只要是一个唯一的值就可以*/
                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();	//如果已经授权的话,就直接调用call方法来打电话
                }

            }

        });
    }

    private void call() {
        try {
            Intent intent = new Intent(Intent.ACTION_CALL);	//表示一个可以调用普通的打电话的action的Intent
            intent.setData(Uri.parse("tel:10086"));		//传入电话数据
            startActivity(intent);				//启动一个打电话的活动
        } catch (SecurityException e) {				//跑出异常
            e.printStackTrace();
        }
    }

    @Override//在调用完前面的申请授权的方法之后,无论是返回何种结果(用户授权和不授权),最终都会回调到下面代码所示的方法中,而授权的结果则是封装在grantResults中
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull 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:
                break;   
        }
    }
}

4.通过以上代码可以发现,如果我们要设置一个需要危险权限的活动,比较规范的步骤是:我们需要先通过一个方法和另外一个值进行比较判断是否授权,如果没有授权的话,那么就需要向用户进行申请授权,如果有授权则可以直接执行相应的行动代码,然后将授权的结果返回到另外一个回调的方法中,如果用户同意,则执行同意的代码,如果不同意,则执行不同意的代码

到这里,简单的运行时权限机制就已经入门了

你可能感兴趣的:(《第一行代码》第七章(运行时权限))