camera2 demo

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "ssss";

    private Context mContext;
    private HandlerThread mHandlerThread;
    private Handler mHandler;

    private CameraManager mCameraManager;
    private CameraDevice mCameraDevice;
    private String mCameraId;
    private CameraCaptureSession mCameraCaptureSession;

    private ImageReader mImageReader;
    private SurfaceHolder mSurfaceHolder;
    private SurfaceView mSurface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().hide();
        mContext = this;

        mHandlerThread = new HandlerThread(TAG);
        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper(), new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                Log.d(TAG, "handleMessage()..." + msg);
                return false;
            }
        });

        mImageReader = ImageReader.newInstance(1280, 720, ImageFormat.YUV_420_888, 3);
        mImageReader.setOnImageAvailableListener(mImageAvailableListener, mHandler);

        mSurface = findViewById(R.id.surface_unlock);
        ViewGroup.LayoutParams lp = mSurface.getLayoutParams();
        lp.height = 720;
        lp.width = 1280;
        mSurface.setLayoutParams(lp);
        SurfaceHolder surfaceHolder = mSurface.getHolder();
        surfaceHolder.setKeepScreenOn(true);
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                Log.d(TAG, "surfaceCreated()...holder:" + holder);
                mSurfaceHolder = holder;
                initcamera();
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                Log.d(TAG, "surfaceChanged()..."+width+" "+height);
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                Log.d(TAG, "surfaceDestroyed()...");
            }
        });
    }

    void initcamera() {
        Log.d(TAG, "initcamera()...");
         mCameraManager = (CameraManager) mContext.getSystemService(Activity.CAMERA_SERVICE);
        if (!checkNotNull(mCameraManager)) {
            Log.d(TAG, "mCameraManager is null...");
            return;
        }

        mCameraId = selectBackOrFrontCamera();
        if (!checkNotNull(mCameraId)) {
            Log.e(TAG, "Camera id is invalid, return!");
        return;
        }

        Log.e(TAG, "mCameraId:"+mCameraId);

        try {
            mCameraManager.openCamera(mCameraId, mCameraStateCallback, mHandler);
        } catch (CameraAccessException e) {
            Log.e(TAG, "Failed to open Camera");
            e.printStackTrace();
        } catch (SecurityException e) {
            Log.e(TAG, "Failed to open Camera");
            e.printStackTrace();
        }
    }

    private ImageReader.OnImageAvailableListener mImageAvailableListener = new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {
            Image image = reader.acquireNextImage();
            byte[] yuvData = new byte[image.getHeight() * image.getWidth() * 3 / 2];;

            image.close();
        }
    };

    private void handleStartPreview() {
        Log.d(TAG, "handleStartPreview()...");
        if (!checkNotNull(mCameraDevice)) {
            Log.e(TAG, "Invalid Camera device");
            return;
        }

        List<Surface> surfaces = new ArrayList<>();
        surfaces.add(mImageReader.getSurface());
        surfaces.add(mSurfaceHolder.getSurface());

        try {
            final CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            builder.addTarget(mImageReader.getSurface());
            builder.addTarget(mSurfaceHolder.getSurface());

            mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
                @Override
                public void onConfigured(@NonNull CameraCaptureSession session) {
                    if (!checkNotNull(mCameraDevice)) {
                        return;
                    }
                    try {
                        builder.set(CaptureRequest.CONTROL_AF_MODE,
                                CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

                        mCameraCaptureSession = session;

                        session.setRepeatingRequest(builder.build(),null, mHandler);
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onConfigureFailed(@NonNull CameraCaptureSession session) {
                    Log.e(TAG, "on configure failed");
                }
            }, mHandler);

        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, "Failed to start preview!");
        }
    }

    private boolean checkNotNull(Object object) {
        return (null != object);
    }

    private String selectBackOrFrontCamera() {
        Log.d(TAG, "selectBackOrFrontCamera()...");
        String cameraId = null;
        try {
            String[] idList = mCameraManager.getCameraIdList();
            for (String id : idList) {
                CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(id);

                Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
                if (facing != null) {
                    if (CameraCharacteristics.LENS_FACING_BACK == facing) {
                        cameraId = id;
                    }
                }
                Log.d(TAG, "Camera Id:" + cameraId);
            }
        } catch (CameraAccessException e) {
            Log.e(TAG, "Invalid Camera Id");
        }
        return cameraId;
    }

    private final CameraDevice.StateCallback mCameraStateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onOpened(@NonNull CameraDevice cameraDevice) {
            Log.d(TAG, "onOpened()...");
            mCameraDevice = cameraDevice;
            handleStartPreview();
        }

        @Override
        public void onDisconnected(@NonNull CameraDevice cameraDevice) {
            Log.d(TAG, "onDisconnected()...");
            mCameraDevice.close();
            mCameraDevice = null;
        }

        @Override
        public void onError(@NonNull CameraDevice cameraDevice, int errorCode) {
            Log.d(TAG, "onError()...code:" + errorCode);
            mCameraDevice.close();
            mCameraDevice = null;
        }
    };

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: camera2demo是一个Android应用程序演示示例,用于演示如何使用Android相机2 API拍摄照片和录制视频。camera2demo具有用户界面,可以启用相机,选择不同的摄像头(前置或后置),调整预览尺寸,并拍摄照片或录制视频。 该示例应用程序展示了如何使用CameraManager类来获取可用的相机设备列表,并使用CameraCharacteristics类获取相机特性,如支持的预览尺寸和拍摄模式等。它还使用了TextureView来作为相机预览的界面元素,并使用了CaptureRequest和CaptureSession类来捕获照片和录制视频。 camera2demo还包括一些基本功能,如闪光灯控制,自动对焦和曝光控制。它允许用户通过点击屏幕来拍摄照片,并通过长按来录制视频。它还提供了一些额外的设置选项,如预览比例和对焦模式的调整。 使用camera2demo可以帮助开发人员学习如何使用Android相机2 API来构建自己的相机应用程序。它提供了一个简单易懂的示例,展示了相机2 API的核心概念和功能。通过阅读和理解camera2demo的源代码,开发人员可以更好地了解相机2 API的用法,并根据自己的需求进行扩展和定制。 ### 回答2: Camera2Demo是一个示例程序,用于展示Android相机API的使用方法。相机API是Android系统提供的一组功能强大的相机控制接口,它允许开发者在应用程序中直接访问设备的相机硬件,并实现各种相机功能。 Camera2Demo的主要目的是帮助开发者理解和学习如何使用相机API来实现自定义相机功能。它展示了如何打开相机、设置相机参数、捕获图像和预览以及处理回调等基本操作。通过查看和理解Camera2Demo的源代码,开发者可以学习到如何使用不同的相机功能,如自动对焦、曝光控制、白平衡调节等。 Camera2Demo中还展示了如何处理相机相关的权限请求和运行时权限申请。由于相机属于敏感权限,需要在应用程序中进行权限管理,以确保用户的个人隐私和数据安全。 除了基本的相机操作外,Camera2Demo还演示了如何实现高级的相机功能,例如拍摄连续照片、录制视频、拍摄RAW图像等。通过学习和运行Camera2Demo,开发者可以了解如何利用相机API来应对各种不同的需求和场景。 总之,Camera2Demo是一个有价值的示例程序,对于那些想要开发自定义相机功能的Android开发者来说,它提供了一个很好的起点和参考。 ### 回答3: camera2demo 是一个 Android 相机应用程序的示例代码。它是基于 Android Camera2 API 开发的,Camera2 API 是 Android 系统中用于访问和控制相机硬件功能的官方 API。相比较于过时的 Camera API,Camera2 API 提供了更丰富、更灵活的相机功能,并且性能更好。 camera2demo 的主要功能是通过调用 Camera2 API 实现相机的打开、预览、拍照和录像等操作。它展示了如何创建一个相机预览界面,如何自动对焦和曝光,如何设置不同的相机参数,以及如何捕获静态图片和录制视频等。 camera2demo 的示例代码是一个完整的 Android 应用程序,你可以直接运行在支持 Camera2 API 的设备上。通过阅读和学习这个示例代码,你可以了解和掌握 Camera2 API 的使用方法和原理,从而在自己的应用程序中实现更高级和更个性化的相机功能。 总之,camera2demo 提供了一个很好的学习资源,帮助开发者理解和使用 Android Camera2 API。通过充分利用 Camera2 API 的强大功能,开发者可以开发出更好的相机应用程序,提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值