package com.xypower.mplive; import android.Manifest; import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.ImageFormat; import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraManager; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.TotalCaptureResult; import android.hardware.camera2.params.StreamConfigurationMap; import android.media.Image; import android.media.ImageReader; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.util.Size; import android.view.Surface; import android.view.TextureView; import android.view.View; import android.widget.Toast; import java.util.Arrays; public class TESTActivity extends AppCompatActivity { private static final String TAG = "Camera2Demo"; private TextureView textureView; private CameraDevice mCameraDevice; private Size imageDimension; private CaptureRequest.Builder captureRequestBuilder; private CameraCaptureSession cameraCaptureSession; private ImageReader imageReader; private CaptureRequest captureRequest; @SuppressLint("MissingInflatedId") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setContentView(R.layout.activity_fullscreen); initPermission(); //权限申请 textureView = findViewById(R.id.texture_view); textureView.setSurfaceTextureListener(textureListener); final CameraCaptureSession.CaptureCallback CaptureCallback = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { //点击拍照后调用此回调 此处弹出提示 Toast.makeText(TESTActivity.this,"Saved:xx/xx/xx/xx.jpg",Toast.LENGTH_SHORT).show(); } }; findViewById(R.id.picture).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { //创建了一个拍照的请求 final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); //与imageReader关联,当点击拍照获取到可用图片时,会触发ImageReader的回调,可在ImageReader的回调中对图片进行保存等处理 captureBuilder.addTarget(imageReader.getSurface()); cameraCaptureSession.capture(captureBuilder.build(),CaptureCallback,null); } catch (CameraAccessException e) { throw new RuntimeException(e); } } }); } private final TextureView.SurfaceTextureListener textureListener = new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) { Log.e(TAG, "onSurfaceTextureAvailable"); openCamera(); } @Override public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) { Log.e(TAG, "onSurfaceTextureSizeChanged"); } @Override public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) { Log.e(TAG, "onSurfaceTextureDestroyed"); return false; } @Override public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) { Log.e(TAG, "onSurfaceTextureUpdated"); } }; //相机状态变化时会调用这里的回调函数 private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { //相机打开时执行 Log.e(TAG, "onOpened"); mCameraDevice=camera; //创建相机预览会话 createCameraPreviewSession(); } @Override public void onDisconnected(@NonNull CameraDevice camera) { //相机链接断开 } @Override public void onError(@NonNull CameraDevice camera, int error) { } }; private void openCamera() { CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { //通过cameraId获取Camera参数 String cameraId = cameraManager.getCameraIdList()[2]; CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); imageDimension=map.getOutputSizes(SurfaceTexture.class)[0]; imageReader=ImageReader.newInstance(640,480, ImageFormat.YUV_420_888,10); // imageReader.setOnImageAvailableListener(onImageAvailableListener,null); if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } cameraManager.openCamera(cameraId, stateCallback, null); } catch (CameraAccessException e) { throw new RuntimeException(e); } } private boolean initPermission(){ ActivityCompat.requestPermissions(TESTActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.CAMERA}, 1); // 高版本Android SDK时使用如下代码 // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // if(!Environment.isExternalStorageManager()){ // Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); // startActivity(intent); // return false; // } // } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[] {Manifest.permission.CAMERA}, 1); return false; } } return true; } private void createCameraPreviewSession(){ SurfaceTexture surfaceTexture=textureView.getSurfaceTexture(); assert surfaceTexture!=null; surfaceTexture.setDefaultBufferSize(imageDimension.getWidth(),imageDimension.getHeight()); //预览的输出画面 Surface surface=new Surface(surfaceTexture); try { //预览请求 captureRequestBuilder=mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); captureRequestBuilder.addTarget(surface); mCameraDevice.createCaptureSession(Arrays.asList(surface, imageReader.getSurface()), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { if (mCameraDevice == null) { return; } cameraCaptureSession = session; updatePreview(); } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { Toast.makeText(TESTActivity.this, "Configuration change", Toast.LENGTH_SHORT).show(); } }, null); } catch (CameraAccessException e) { throw new RuntimeException(e); } } private void updatePreview(){ captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); captureRequest = captureRequestBuilder.build(); try { cameraCaptureSession.setRepeatingRequest(captureRequest,null,null); } catch (CameraAccessException e) { throw new RuntimeException(e); } } private final ImageReader.OnImageAvailableListener onImageAvailableListener= new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image=null; image=reader.acquireLatestImage(); Log.e("lkx","1"); //此处可对图片进行处理 比如保存到本地 image.close(); } }; }