android app使用camera

该类描述
这个类可以完成摄像头的前后摄、拍照预览、并且拍照出来的照片也可以进行旋转包括镜像解决

public class CameraRearWZXActivity extends Activity implements View.OnClickListener {
    private static final SparseIntArray ORIENTATIONS = new SparseIntArray();

    ///为了使照片竖直显示
    static {
        ORIENTATIONS.append(Surface.ROTATION_0, 180);
        ORIENTATIONS.append(Surface.ROTATION_90, 180);
        ORIENTATIONS.append(Surface.ROTATION_180, 180);
        ORIENTATIONS.append(Surface.ROTATION_270, 180);
    }
    private boolean DoWantToClick =false;
    public static String dataState ="0";
    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;
    private ImageView iv_show;
    private CameraManager mCameraManager;//摄像头管理器
    private Handler childHandler, mainHandler;
    private String mCameraID;//摄像头Id 0 为后  1 为前
    private ImageReader mImageReader;
    private CameraCaptureSession mCameraCaptureSession;
    private CameraDevice mCameraDevice;
    private ImageView take_photo_button;
    private RelativeLayout ll_confirm_layout;
    private ImageView cancle_save_button,save_button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setContentView(R.layout.camera_front_wzx);
        initVIew();
    }

    /**
     * 初始化
     */
     private void initVIew() {
        cancle_save_button = (ImageView) findViewById(R.id.cancle_save_button);
        save_button =(ImageView)findViewById(R.id.save_button);
        ll_confirm_layout = (RelativeLayout) findViewById(R.id.ll_confirm_layout);
        take_photo_button = (ImageView) findViewById(R.id.take_photo_button);
        iv_show = (ImageView) findViewById(R.id.iv_show_camera2_activity);
        //mSurfaceView
        mSurfaceView = (SurfaceView) findViewById(R.id.surface_view_camera2_activity);
        mSurfaceView.setOnClickListener(this);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.setKeepScreenOn(true);
        // mSurfaceView添加回调
        mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) { //SurfaceView创建
                // 初始化Camera
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    initCamera2();
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) { //SurfaceView销毁
                // 释放Camera资源
                if (null != mCameraDevice) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        mCameraDevice.close();
                    }
                    CameraRearWZXActivity.this.mCameraDevice = null;
                }
            }
        });
        take_photo_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePicture();
                take_photo_button.setVisibility(View.GONE);
                ll_confirm_layout.setVisibility(View.VISIBLE);
            }
        });
        //这个是fail
        cancle_save_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent1 = getIntent();
                if(intent1.getStringExtra("infoType").equals("auto")){

                    if (FactoryDefaultData.GetData("overalldata")==null){

                    }else {
                        String Overalldata =FactoryDefaultData.GetData("overalldata");
                        Log.d("wzx11111111111111","Overalldata"+FactoryDefaultData.GetData("overalldata"));

                        char[] temp = Overalldata.toCharArray();
                        temp[12] = '2';
                        FactoryDefaultData.SetData("overalldata",String.valueOf(temp));
                        openNextActivity();
                        Log.d("wzx11111111111111","========="+FactoryDefaultData.GetData("overalldata"));
                    }
                }else {

                    if (FactoryDefaultData.GetData("overalldata")==null){

                    }else {
                        String Overalldata =FactoryDefaultData.GetData("overalldata");
                        Log.d("wzx11111111111111","Overalldata"+FactoryDefaultData.GetData("overalldata"));

                        char[] temp = Overalldata.toCharArray();
                        temp[12] = '2';
                        FactoryDefaultData.SetData("overalldata",String.valueOf(temp));
                        DoWantToClick =true;
                        dataState="2";
                        Log.d("wzx11111111111111","========="+FactoryDefaultData.GetData("overalldata"));
                    }
                }

                SaveResult.save(getApplicationContext(), "rearcamera", false);

                finish();
            }
        });
         save_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent2 = getIntent();
                if(intent2.getStringExtra("infoType").equals("auto")){

                    if (FactoryDefaultData.GetData("overalldata")==null){

                    }else {
                        String Overalldata =FactoryDefaultData.GetData("overalldata");
                        Log.d("wzx11111111111111","Overalldata"+FactoryDefaultData.GetData("overalldata"));

                        char[] temp = Overalldata.toCharArray();
                        temp[12] = '1';
                        FactoryDefaultData.SetData("overalldata",String.valueOf(temp));
                        openNextActivity();
                        Log.d("wzx11111111111111","========="+FactoryDefaultData.GetData("overalldata"));
                    }
                }else {


                    if (FactoryDefaultData.GetData("overalldata")==null){

                    }else {
                        String Overalldata =FactoryDefaultData.GetData("overalldata");
                        Log.d("wzx11111111111111","Overalldata"+FactoryDefaultData.GetData("overalldata"));

                        char[] temp = Overalldata.toCharArray();
                        temp[12] = '1';
                        FactoryDefaultData.SetData("overalldata",String.valueOf(temp));
                        DoWantToClick = true;
                        dataState = "1";
                        Log.d("wzx11111111111111","========="+FactoryDefaultData.GetData("overalldata"));
                    }
                }
                SaveResult.save(getApplicationContext(), "rearcamera", true);
                finish();
            }
        });
    }
    //这个是要跳转
    private void openNextActivity(){
        Intent app_intent = new Intent(CameraRearWZXActivity.this, BatteryActivity.class);
        app_intent.putExtra("infoType", "auto");
        startActivity(app_intent);
        finish();
    }
    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        Log.e("MainActivity","dispatchKeyEvent:keyCode--"+event.getKeyCode());
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_MENU|| event.getKeyCode() == KeyEvent.KEYCODE_HOME) {
            //拦截到home和back键然后做相应的功能


            Log.d("111111111111111111", "KEYCODE_BACK KEYCODE_HOME: 111111");
            if (DoWantToClick){
                finish();
            }else {

            }
//			finish();
            return true;
        } else {
            return super.dispatchKeyEvent(event);
        }
    }
    /**
     * 初始化Camera2
     */
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void initCamera2() {
        HandlerThread handlerThread = new HandlerThread("Camera2");
        handlerThread.start();
        childHandler = new Handler(handlerThread.getLooper());
        mainHandler = new Handler(getMainLooper());
//        mCameraID = "" + CameraCharacteristics.LENS_FACING_BACK;//后摄像头
        mCameraID = "" + CameraCharacteristics.LENS_FACING_FRONT;//前摄像头


        mImageReader = ImageReader.newInstance(1080, 1920, ImageFormat.JPEG,1);
        mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { //可以在这里处理拍照得到的临时照片 例如,写入本地
            @Override
            public void onImageAvailable(ImageReader reader) {
                mCameraDevice.close();
                mSurfaceView.setVisibility(View.GONE);
                iv_show.setVisibility(View.VISIBLE);
                // 拿到拍照照片数据
                Image image = reader.acquireNextImage();

                ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                byte[] bytes = new byte[buffer.remaining()];
                buffer.get(bytes);//由缓冲区存入字节数组
                final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                if (bitmap != null) {
                    Matrix matrix = new Matrix();
//                    matrix.postRotate(0);  这个是后摄
                    matrix.postRotate(90); //这个是前摄

                    Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
                    iv_show.setImageBitmap(rotatedBitmap);
                }
            }
        }, mainHandler);
        //获取摄像头管理
        mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        try {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            //打开摄像头
            mCameraManager.openCamera(mCameraID, stateCallback, mainHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }


    /**
     * 摄像头创建监听
     */
    private CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onOpened(CameraDevice camera) {//打开摄像头
            mCameraDevice = camera;
            //开启预览
            takePreview();
        }

        @Override
        public void onDisconnected(CameraDevice camera) {//关闭摄像头
            if (null != mCameraDevice) {
                mCameraDevice.close();
                CameraRearWZXActivity.this.mCameraDevice = null;
            }
        }

        @Override
        public void onError(CameraDevice camera, int error) {//发生错误
            Toast.makeText(CameraRearWZXActivity.this, "摄像头开启失败", Toast.LENGTH_SHORT).show();
        }
    };

    /**
     * 开始预览
     */
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void takePreview() {
        try {
            // 创建预览需要的CaptureRequest.Builder
            final CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            // 将SurfaceView的surface作为CaptureRequest.Builder的目标
            previewRequestBuilder.addTarget(mSurfaceHolder.getSurface());
            // 创建CameraCaptureSession,该对象负责管理处理预览请求和拍照请求
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                mCameraDevice.createCaptureSession(Arrays.asList(mSurfaceHolder.getSurface(), mImageReader.getSurface()), new CameraCaptureSession.StateCallback() // ③
                {
                    @Override
                    public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                        if (null == mCameraDevice) return;
                        // 当摄像头已经准备好时,开始显示预览
                        mCameraCaptureSession = cameraCaptureSession;
                        try {
                            // 自动对焦
                            previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                            // 打开闪光灯
                            previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
                            // 显示预览
                            CaptureRequest previewRequest = previewRequestBuilder.build();
                            mCameraCaptureSession.setRepeatingRequest(previewRequest, null, childHandler);
                        } catch (CameraAccessException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
                        Toast.makeText(CameraRearWZXActivity.this, "配置失败", Toast.LENGTH_SHORT).show();
                    }
                }, childHandler);
            }
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    /**
     * 点击事件
     */
    @Override
    public void onClick(View v) {
//        takePicture();
    }

    /**
     * 拍照
     */
    private void takePicture() {
        if (mCameraDevice == null) return;
        // 创建拍照需要的CaptureRequest.Builder
        final CaptureRequest.Builder captureRequestBuilder;
        try {
            captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
            // 将imageReader的surface作为CaptureRequest.Builder的目标
            captureRequestBuilder.addTarget(mImageReader.getSurface());
            // 自动对焦
            captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
            // 自动曝光
            captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
            // 获取手机方向
//            CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
//            int sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);

//            int deviceOrientation = ORIENTATIONS.get(rotation);
//            int rotation = getWindowManager().getDefaultDisplay().getRotation();
            int rotation =360;
            Log.d("wzx1111", "takePicture: "+rotation);
            // 根据设备方向计算设置照片的方向
            captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));
            //拍照
            CaptureRequest mCaptureRequest = captureRequestBuilder.build();
            mCameraCaptureSession.capture(mCaptureRequest, null, childHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 10上,应用程序可以使用UVC(USB Video Class)标准来打开摄像头。UVC是一种基于USB设备的视频通信标准,它允许应用程序与外部摄像头进行通信并接收视频流。下面是使用UVC打开摄像头的步骤: 1. 在AndroidManifest.xml文件中添加相应的权限。例如,添加相机权限:<uses-permission android:name="android.permission.CAMERA" /> 2. 在应用程序中使用摄像头API来检测是否有支持UVC的摄像头设备。可以使用USBManager类来获取连接的USB设备列表,并判断其中是否有UVC摄像头。 3. 如果有支持UVC的摄像头设备,则可以使用USBManager类打开该设备。使用openDevice()方法打开设备,然后使用claimInterface()方法请求访问USB接口。 4. 打开摄像头设备之后,可以使用相应的UVC命令来设置和控制摄像头的功能。例如,使用UVC命令来调整曝光、对焦、白平衡等设置。 5. 接下来,可以使用UVC摄像头的输出流来获取视频数据。可以使用USBManager的bulkTransfer()方法从USB设备接收视频数据流,并进行相应的处理和显示。 需要注意的是,在使用UVC打开摄像头时,需要保证设备具有UVC驱动程序的支持,并且摄像头设备已正确连接到Android设备的USB端口。此外,还需要注意权限的申请和正确的UVC命令的使用,以便能够正确地与UVC摄像头进行通信和控制。 总之,使用UVC打开摄像头可以为Android 10上的应用程序提供与外部摄像头的连接和视频数据传输功能,让应用程序能够更加灵活地处理和显示摄像头的图像数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值