| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | import static android.content.ContentValues.TAG; |
| | | import static android.os.Environment.DIRECTORY_DOCUMENTS; |
| | | |
| | | /** |
| | | * Record模式下,Target = 录像和ImageReader图片 |
| | | */ |
| | | public class Camera2TextureView extends TextureView { |
| | | |
| | | private Context mContext; |
| | |
| | | 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(); |
| | |
| | | surfaceTexture.setDefaultBufferSize(1920, 1080); |
| | | previewSurface = new Surface(surfaceTexture); |
| | | |
| | | try { |
| | | /*try { |
| | | createPreviewSession(); |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | } |
| | | }*/ |
| | | } |
| | | |
| | | @Override |
| | |
| | | @Override |
| | | public void onConfigured(@NonNull CameraCaptureSession session) { |
| | | mCaptureSession = session; |
| | | startPreview(mCameraDevice); |
| | | // startPreview(mCameraDevice); |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | |
| | | 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); |
| | |
| | | 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()); |
| | |
| | | } |
| | | |
| | | 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(); |
| | | } |
| | | |
| | | }; |