android:获取相机权限

一,代码

xml只有一个按钮

java:

package com.example.okdemo1.activity;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.okdemo1.R;
import com.zhihu.matisse.Matisse;
import com.zhihu.matisse.MimeType;
import com.zhihu.matisse.engine.impl.GlideEngine;
import com.zhihu.matisse.internal.entity.CaptureStrategy;

public class PermissionActivity extends AppCompatActivity {

    private static final int CAMERA_PERMISSION_REQUEST_CODE = 101;

    private ActivityResultLauncher<Intent> mCameraLauncher;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_permission);

// 需要事先注册
        mCameraLauncher = registerForActivityResult(
                // 回调函数的参数将是一个ActivityResult
                new ActivityResultContracts.StartActivityForResult(),
                // 回调函数
                this::handleCameraResult);


        //给按钮增加点击事件
        Button button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                askCameraPermission();
            }
        });

    }

    //请求权限,如果已有权限则打开相机
    private void askCameraPermission(){
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            // 如果没有获得相机权限,就请求权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);
        } else {
            // 已经获得相机权限,可以打开相机
            openCamera();
        }
    }

    //请求权限的回调
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 用户同意相机权限,可以打开相机
                openCamera();
            } else {
                // 用户拒绝相机权限,可以给出提示或者关闭相关功能
                Toast.makeText(this, "请授予相机权限", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void openCamera() {
        if (mCameraLauncher != null) {
            // launch的输入参数是泛型,对应ActivityResultLauncher<Intent>
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // 确保有相机应用可用
            if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                mCameraLauncher.launch(takePictureIntent);
            }
        }
    }

    private void handleCameraResult(ActivityResult result) {
        if (result.getResultCode() == RESULT_OK) {
            Intent data = result.getData();
            if (data != null) {
                Bundle extras = data.getExtras();
                if (extras != null) {
                    Uri uri = data.getData();
                    Bitmap imageBitmap = (Bitmap) extras.get("data");
                    // 后续处理逻辑
                }
            }
        }
    }

}

 

二,测试效果

posted @ 2025-06-07 10:50  刘宏缔的架构森林  阅读(60)  评论(0)    收藏  举报