行业知识
安卓利用CameraX实现拍照录像
2026-11-07 13:10:43
来源:互联网转载
废话不多说直接上代码
一,导入依赖
// CameraX 相关依赖 def cameraxVersion = "1.1.0-alpha05" implementation "androidx.camera:camera-core:${cameraxVersion}" implementation "androidx.camera:camera-camera2:${cameraxVersion}" implementation "androidx.camera:camera-lifecycle:${cameraxVersion}" implementation 'androidx.camera:camera-view:1.0.0-alpha25' 二、添加权限
三、实现代码
impindex.php/tags-1038.html" >ort android.Manifest;import android.annotation.SuppressLint;import android.content.ContentValues;import android.content.pm.PackageManager;import android.os.Bundle;import android.provider.MediaStore;import android.view.View;import android.widget.Button;import android.widget.Toast;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import androidx.camera.core.CameraSelector;import androidx.camera.core.ImageCapture;import androidx.camera.core.ImageCaptureException;import androidx.camera.core.Preview;import androidx.camera.core.VideoCapture;import androidx.camera.lifecycle.ProcessCameraProvider;import androidx.camera.view.PreviewView;import androidx.core.app.ActivityCompat;import androidx.core.content.ContextCompat;import com.google.common.util.concurrent.ListenableFuture;public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final int REQUEST_CODE_RECORD_AUDIO_PERMISSION = 1001; private static final int REQUEST_CODE_CAMERA_PERMISSION = 1002; private static final int REQUEST_CODE_STORAGE_PERMISSION = 1003; private ListenableFuture processCameraProviderListenableFuture; private PreviewView previewView; private Button btn_photograph; //拍照 private ImageCapture imageCapture; private CameraSelector cameraSelector; private boolean isUsingFrontCamera = false; // 默认使用前置摄像头 private Button btn_picture_recording; //录像 private VideoCapture videoCapture; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); previewView = findViewById(R.id.previewView); btn_photograph = findViewById(R.id.btn_photograph); btn_picture_recording = findViewById(R.id.btn_picture_recording); btn_photograph.setOnClickListener(this); btn_picture_recording.setOnClickListener(this); // 检查权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_RECORD_AUDIO_PERMISSION); } else { initializeCamera(); } } // 初始化相机 private void initializeCamera() { processCameraProviderListenableFuture = ProcessCameraProvider.getInstance(this); processCameraProviderListenableFuture.addListener(() -> { try { ProcessCameraProvider processCameraProvider = processCameraProviderListenableFuture.get(); start(processCameraProvider); } catch (Exception e) { throw new RuntimeException(e); } }, ContextCompat.getMainExecutor(this)); } @SuppressLint("RestrictedApi") private void start(ProcessCameraProvider processCameraProvider) { processCameraProvider.unbindAll(); cameraSelector = new CameraSelector.Builder() .requireLensFacing(isUsingFrontCamera ? CameraSelector.LENS_FACING_FRONT : CameraSelector.LENS_FACING_BACK) .build(); Preview preview = new Preview.Builder().build(); preview.setSurfaceProvider(previewView.getSurfaceProvider()); imageCapture = new ImageCapture.Builder() .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) .build(); videoCapture = new VideoCapture.Builder() .setVideoFrameRate(30) .build(); processCameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture, videoCapture); } @SuppressLint("RestrictedApi") @Override public void onClick(View view) { if (view.getId() == R.id.btn_photograph) { captureImage(); } if (view.getId() == R.id.btn_picture_recording) { if (btn_picture_recording.getText().equals("录像")) { btn_picture_recording.setText("停止"); captureVideo(); } else { btn_picture_recording.setText("录像"); videoCapture.stopRecording(); } } } // 拍照 private void captureImage() { long timeStamp = System.currentTimeMillis(); ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, timeStamp); contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg"); imageCapture.takePicture( new ImageCapture.OutputFileOptions.Builder( getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues ).build(), ContextCompat.getMainExecutor(this), new ImageCapture.OnImageSavedCallback() { @Override public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) { Toast.makeText(MainActivity.this, "拍照保存成功", Toast.LENGTH_SHORT).show(); } @Override public void onError(@NonNull ImageCaptureException exception) { Toast.makeText(MainActivity.this, "拍照保存失败: " + exception.getMessage(), Toast.LENGTH_SHORT).show(); } }); } // 录像 @SuppressLint("RestrictedApi") private void captureVideo() { if (videoCapture != null) { long timeStamp = System.currentTimeMillis(); ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, timeStamp); contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4"); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { return; } videoCapture.startRecording( new VideoCapture.OutputFileOptions.Builder( getContentResolver(), MediaStore.Video.Media.EXTERNAL_CONTENT_URI, contentValues ).build(), ContextCompat.getMainExecutor(this), new VideoCapture.OnVideoSavedCallback() { @Override public void onVideoSaved(@NonNull VideoCapture.OutputFileResults outputFileResults) { Toast.makeText(MainActivity.this, "视频拍摄成功", Toast.LENGTH_SHORT).show(); } @Override public void onError(int videoCaptureError, @NonNull String message, @Nullable Throwable cause) { Toast.makeText(MainActivity.this, "视频拍摄失败: " + message, Toast.LENGTH_SHORT).show(); } } ); } else { Toast.makeText(MainActivity.this, "视频录制功能未初始化", Toast.LENGTH_SHORT).show(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE_RECORD_AUDIO_PERMISSION) { for (int i = 0; i 布局代码
上一篇:谷歌的dns服务器怎么设置?
下一篇:服务器怎么清除面板?