Android动态获取权限

Android权限分为普通权限和危险权限两种。普通权限系统会自动授权,而危险权限则需要用户手动授权,否则无法使用相关功能。

危险权限的获取

以调用相机权限为例

首先在AndroidMenifest.xml中声明相机权限

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

这时候可以在手机的应用详情中看到所申请的权限,如下图所示
在这里插入图片描述
在Android6.0之前这个样子就够了,但是6.0之后还需要动态申请权限。

动态申请权限

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
	ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 1);
}else {
	openCamera();
}

首先通过ContextCompat.checkSelfPermission()方法检查是否获取权限,在checkSelfPermission()方法的第二个参数中放入所申请的权限的权限名。如果该方法的返回值等于PackageManager.PERMISSION_GRANTED,则说明用户已经授予权限了可以直接打开相机。若不相等,则通过 ActivityCompat.requestPermissions()方法向用户申请权限。requestPermissions()方法的第二个和第三个参数分别为String数组和请求码requestCode。在String数组中放入权限名。请求码为一个数字,对应于后面onRequestPermissionsResult()方法中的请求码,用以区分不同的请求。
执行以上代码后手机会弹出权限请求窗口,如下图所示
在这里插入图片描述
无论用户选择禁止还是始终允许程序都会回调到onRequestPermissionsResult()方法中,接着需要重写onRequestPermissionsResult()方法。

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case 1:
                if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    openCamera();
                }else {
                    Toast.makeText(MainActivity.this, "相机权限获取失败", Toast.LENGTH_LONG).show();
                }
                break;
            default:
        }
    }

授权的结果已经被授权到grantResults中,在if语句中判断是否正确获取权限,获取权限则打开相机。

完整代码

public class MainActivity extends AppCompatActivity {

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

        Button cameraTest;
        cameraTest = (Button)findViewById(R.id.bt_camera);
        cameraTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 1);
                }else {
                    openCamera();
                }
            }
        });
    }

    public void openCamera(){
        try {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case 1:
                if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    openCamera();
                }else {
                    Toast.makeText(MainActivity.this, "相机权限获取失败", Toast.LENGTH_LONG).show();
                }
                break;
            default:
        }
    }
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值