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");
// 后续处理逻辑
}
}
}
}
}
二,测试效果

浙公网安备 33010602011771号