Android内容提供器(一)——权限机制

内容提供器(Content Provider)是Android 跨程序共享数据的标准方式,内容提供器可以选择对哪一部分数据共享,从而不会有泄露的风险。

一、权限机制

Android的权限归为两类:

  • 普通权限:不会威胁到安全和隐私的权限,系统会自动授权。普通权限需要在AndroidManifest.xml中声明即可
  • 危险权限:触及用户隐私或设备安全性的权限,这部分权限必须用户手动点击授权,危险权限一般涉及地理位置,联系人信息,日程,短信,存储等。危险权限在使用时需要运行时权限处理

二、运行时申请权限

新建一个空项目day13_RuntimePermissionTest

申请CALL_PHONE权限

1、主布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/make_call"
        android:text="拨打电话"/>

</LinearLayout>

2、主活动

Button button_makecall = findViewById(R.id.make_call);
button_makecall.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        try{
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:10086"));
            startActivity(intent);
        }catch (SecurityException e){
            e.printStackTrace();
        }
    }
});

3、AndroidManifest.xml

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

4、运行

在高于6.0的系统上:点击按钮发现报java.lang.SecurityException: Permission Denial错:
在这里插入图片描述
在6.0以上的系统上需要权限处理:

5、运行时权限处理

步骤如下:
一、 判断用户是否已经给予授权

  • ContextCompat.checkSelfPermission()两个参数:
    • 参数一:Context
    • 参数二:权限名,比如打电话的权限名Manifest.permission.CALL_PHONE
  • 将方法返回值和PackageManger.PERMISSION_GRANTED比较,相等则为授权成功

二、如果授权成功,执行打电话的逻辑即可
如果授权失败,需要申请授权:

  • ActivityCompat.requestPermissions()三个参数:
    • 参数一:Activity实例
    • 参数二:String数组,把要申请的权限名写入数组
    • 参数三:请求码,是个唯一值就行

三、申请授权后会回调到onRequestPermissionsResult()方法,授权的结果封装在grantResults参数里。如果授权成功,执行打电话的逻辑即可。授权失败,则弹出提示。

主活动:


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button_makecall = findViewById(R.id.make_call);
        button_makecall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                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();
                }
            }
        });
    }

    @Override
    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, "申请权限被拒绝", Toast.LENGTH_SHORT).show();
                }
        }
    }

    private void call() {
        try{
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:10086"));
            startActivity(intent);
        }catch (SecurityException e){
            e.printStackTrace();
        }
    }
}

6、运行

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值