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; } } }
到这里,简单的运行时权限机制就已经入门了