android使用Camera调用系统原生的摄像头(前置与后置)

1.Camera类

Camera是应用层软件直接使用的类,包含了启动,预览,拍摄以及关闭摄像头等操作的接口。
Camera mCamera = null;

 int numberOfCameras = Camera.getNumberOfCameras();// 获取摄像头个数
         //遍历摄像头信息
        for (int cameraId = 0; cameraId < numberOfCameras; cameraId++) {
            Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
            Camera.getCameraInfo(cameraId, cameraInfo);
            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {//前置摄像头
                mCamera = Camera.open(cameraId);//打开摄像头
            }
        }

1.Camera.CameraInfo.CAMERA_FACING_FRONT :前置摄像头
2.Camera.CameraInfo.CAMERA_FACING_BACK:后置摄像头

2.方法
  • Camera open():打开Camera,返回一个Camera实例。
  • Camera open(int cameraId):根据cameraId打开一个指定的Camera,返回一个Camera实例。
  • void release():释放资源
  • int getNumberOfCameras():获取当前设备支持的Camera硬件个数。
  • Parameters getParameters():获取Camera的各项参数设置类。
  • void setParameters(Camera.Parameters params):通过params把Camera的各项参数写入到Camera中。
  • void setDisplayOrientation(int degrees):摄像预览的旋转度。
  • void setPreviewDisplay(SurfaceHolder holder):设置Camera预览的SurfaceHolder。
  • void starPreview():开始Camera的预览。
  • void stopPreview():停止Camera的预览
  • void autoFocus(Camera.AutoFocusCallback cb):自动对焦。
  • void takePicture(Camera.ShutterCallback shutter,Camera.PictureCallback raw,Camera.PictureCallback jpeg):拍照。(参数:拍照前的一些设置(如:拍摄快门声);未经处理的yuv数据;JPEG图像数据的回调)
  • void lock():锁定Camera硬件,使其他应用无法访问。
  • void unlock():解锁Camera硬件,使其他应用可以访问。
 /**
   * 关闭相机,释放资源。
   */
  private void closeCamera() {
      if (mCamera != null) {
          mCamera.release();
          mCamera = null;
      }
  }	
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Qt for Android调用原生系统摄像头进行录像并保存输出,可以使用Android NDK来实现。下面是实现步骤: 1. 在Qt项目中添加一个Java文件,文件名为CameraRecorder.java,代码如下: ``` package com.example.myapplication; import android.hardware.Camera; import android.media.CamcorderProfile; import android.media.MediaRecorder; import android.os.Environment; import android.util.Log; import android.view.SurfaceHolder; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; public class CameraRecorder implements SurfaceHolder.Callback { private static final String TAG = "CameraRecorder"; private Camera mCamera; private MediaRecorder mMediaRecorder; private SurfaceHolder mHolder; private boolean mIsRecording = false; public CameraRecorder(SurfaceHolder holder) { mHolder = holder; mHolder.addCallback(this); } public void startRecording() { if (mCamera == null) { mCamera = getCameraInstance(); } try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (IOException e) { Log.e(TAG, "Error starting camera preview: " + e.getMessage()); } mMediaRecorder = new MediaRecorder(); mCamera.unlock(); mMediaRecorder.setCamera(mCamera); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); mMediaRecorder.setProfile(profile); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); String currentDateAndTime = dateFormat.format(new Date()); File mediaFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/DCIM/Camera/", "VID_" + currentDateAndTime + ".mp4"); mMediaRecorder.setOutputFile(mediaFile.getAbsolutePath()); try { mMediaRecorder.prepare(); } catch (IOException e) { Log.e(TAG, "Error preparing media recorder: " + e.getMessage()); } mMediaRecorder.start(); mIsRecording = true; } public void stopRecording() { if (mIsRecording) { mMediaRecorder.stop(); mMediaRecorder.release(); mCamera.lock(); mCamera.release(); mCamera = null; mIsRecording = false; } } private Camera getCameraInstance() { Camera camera = null; try { camera = Camera.open(); } catch (Exception e) { Log.e(TAG, "Error opening camera: " + e.getMessage()); } if (camera != null) { Camera.Parameters params = camera.getParameters(); List<Camera.Size> sizes = params.getSupportedPreviewSizes(); Camera.Size size = sizes.get(0); params.setPreviewSize(size.width, size.height); camera.setParameters(params); } return camera; } @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { stopRecording(); } } ``` 2. 在Qt项目的AndroidManifest.xml文件中添加如下权限: ``` <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 3. 在Qt项目中添加一个QML页面,页面中添加一个SurfaceView控件,并在控件上叠加一个按钮,代码如下: ``` import QtQuick 2.0 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.2 import QtQuick.Dialogs 1.2 import QtAndroidExtras 1.4 Rectangle { id: root width: 360 height: 640 color: "white" SurfaceView { id: surfaceView anchors.fill: parent } Button { id: btnRecorder text: "Start Recording" width: 200 height: 50 anchors.centerIn: parent onClicked: { if (btnRecorder.text === "Start Recording") { var recorder = QtAndroid.createQmlObject('import com.example.myapplication 1.0; CameraRecorder {id: recorder;}', surfaceView); recorder.startRecording(); btnRecorder.text = "Stop Recording"; } else { recorder.stopRecording(); btnRecorder.text = "Start Recording"; } } } } ``` 4. 编译并运行Qt项目,在页面中点击按钮即可开始录制视频。视频文件保存在SD卡的DCIM/Camera目录下。 以上代码仅为示例代码,具体实现可以根据自己的需求进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值