whycxzp
2024-07-27 efa5fe48ebc866ec07a597ef551cf7e13c3b7aba
app/src/main/java/com/whyc/widget/Camera2TextureView.java
@@ -15,6 +15,7 @@
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.Image;
import android.media.ImageReader;
import android.media.MediaCodec;
@@ -28,6 +29,7 @@
import android.support.v4.app.ActivityCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Size;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
@@ -43,6 +45,7 @@
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Comparator;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -50,6 +53,9 @@
import static android.content.ContentValues.TAG;
import static android.os.Environment.DIRECTORY_DOCUMENTS;
/**
 * Record模式下,Target = 录像和ImageReader图片
 */
public class Camera2TextureView extends TextureView {
    private Context mContext;
@@ -114,6 +120,16 @@
        CameraManager cm = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
        try {
            String cameraId = cm.getCameraIdList()[0];
            /*CameraCharacteristics cameraCharacteristics = cm.getCameraCharacteristics(cameraId);
            StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
            Size[] outputSizes = map.getOutputSizes(SurfaceTexture.class);
            Arrays.sort(outputSizes, new Comparator<Size>() {
                @Override
                public int compare(Size lhs, Size rhs) {
                    return Integer.compare(rhs.getWidth(), lhs.getWidth());
                }
            });
            System.out.println(outputSizes);*/
            cm.openCamera(cameraId,mDeviceStateCallback,null);
        }catch (Exception e){
            e.printStackTrace();
@@ -128,11 +144,11 @@
                surfaceTexture.setDefaultBufferSize(1920, 1080);
                previewSurface = new Surface(surfaceTexture);
                try {
                /*try {
                    createPreviewSession();
                }catch (Exception e){
                    e.printStackTrace();
                }
                }*/
            }
            @Override
@@ -152,7 +168,7 @@
                @Override
                public void onConfigured(@NonNull CameraCaptureSession session) {
                    mCaptureSession = session;
                    startPreview(mCameraDevice);
//                    startPreview(mCameraDevice);
                }
                @Override
@@ -227,6 +243,7 @@
    }
    public void createRecorderSession(){
//        mImageReader = ImageReader.newInstance(1920, 1080, ImageFormat.JPEG, 1);
        mImageReader = ImageReader.newInstance(1920, 1080, ImageFormat.JPEG, 1);
        surfaceForStream = mImageReader.getSurface();
        mImageReader.setOnImageAvailableListener(mImageReaderListener, null);
@@ -247,7 +264,8 @@
                public void onConfigured(@NonNull CameraCaptureSession session) {
                    mCaptureSession = session;
                    try {
                        recordRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
//                        recordRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                        recordRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
//                        recordRequest.addTarget(previewSurface);
                        recordRequest.addTarget(mImageReader.getSurface());
@@ -274,53 +292,32 @@
    }
    private ImageReader.OnImageAvailableListener mImageReaderListener = reader -> {
        /*long now = System.currentTimeMillis();
        SharedPreferences camera2Time = mContext.getSharedPreferences("camera2Time", Context.MODE_PRIVATE);
        long lastTime = camera2Time.getLong("time", 0);
        if (lastTime == 0 || now-lastTime > 1000) {
            //这里只是演示test
            llUpText.setVisibility(View.VISIBLE);
            tvDevice.setText("这是测试的动态赋值");
            camera2Time.edit().putLong("time", now).apply();
        try {
            SharedPreferences camera2Time = mContext.getSharedPreferences("camera2Time", Context.MODE_PRIVATE);
            long lastTime = camera2Time.getLong("time", 0);
            // 获取到拍照的图像数据
            Image image = reader.acquireNextImage();
            long now = image.getTimestamp();
            long gap = (now - lastTime) / 1000000000;
            if (lastTime == 0 || gap > 3) {
                camera2Time.edit().putLong("time", now).apply();
                //这里只是演示test
           /* llUpText.setVisibility(View.VISIBLE);
            tvDevice.setText("这是测试的动态赋值");*/
                // 获取图片的字节数组
                ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                byte[] data = new byte[buffer.remaining()];
                buffer.get(data);
                // 释放图像资源
                image.close();
            // 获取图片的字节数组
            ByteBuffer buffer = image.getPlanes()[0].getBuffer();
            byte[] data = new byte[buffer.remaining()];
            buffer.get(data);
            // 释放图像资源
            image.close();
            // 保存图片到相册
            saveImageToGallery(data);
        }else{
            // 获取到拍照的图像数据
            Image image = reader.acquireNextImage();
            image.close();
        }*/
        SharedPreferences camera2Time = mContext.getSharedPreferences("camera2Time", Context.MODE_PRIVATE);
        long lastTime = camera2Time.getLong("time", 0);
        // 获取到拍照的图像数据
        Image image = reader.acquireNextImage();
        long now = image.getTimestamp()/1000000000;
        if (lastTime == 0  || now-lastTime > 5) {
            camera2Time.edit().putLong("time", now).apply();
            //这里只是演示test
            llUpText.setVisibility(View.VISIBLE);
            tvDevice.setText("这是测试的动态赋值");
            // 获取图片的字节数组
            ByteBuffer buffer = image.getPlanes()[0].getBuffer();
            byte[] data = new byte[buffer.remaining()];
            buffer.get(data);
            // 释放图像资源
            image.close();
            // 保存图片到相册
            saveImageToGallery(data);
        }else{
            image.close();
                // 保存图片到相册
                saveImageToGallery(data);
            } else {
                image.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    };