Camera1

 Camera1 API虽在Android5.0后逐渐被Camera2所取代,但部分安卓设备版本低、对Camera2的底层驱动并不完善亦或是历史原因导致的开发成本差异,让其到目前仍然未被淘汰。

权限申请

<!-- 相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 存储权限(保存照片用) -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="28" />

<uses-feature  android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />

动态获取权限:

 

开启摄像头

注:当摄像头开启未关闭,会触发异常报错

Camera.setDisplayOrientation()设置摄像头旋转角度。

相机参数配置

     参数配置是Camera1调用的重中之重,其通过Camera.getParameters()获取参数对象、修改属性属性后调用Camera.setParamers(param)完成配置生效。

预览分辨率

getSupportedPreviewSizes()获得摄像头支持的预览分辨率,选择摄像头所支持的分辨率,且需保证与画布比例保持一致,防止图像拉伸。通过param.setPreviewSize(width,height)完成配置

拍照分辨率

getSupportedPictureSizes()获的摄像头支持的拍照分辨率。通过param.setPictureSize(width, height)完成配置。

图像格式

param.setPictureFormat(ImageFormat.JPEG)默认为JPEG

param.setPreviewFormat(format)常见的为ImageForamt.NV21YV12

图像压缩质量

param.setJpegQuality(80)这个值通常为0-100,值越大图像质量越好、图像越大

对焦模式

getSupportedFocusModes()获得

param.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO)完成配置。

也可通过param.setFocusAreas(areas)完成手动聚焦(通过SurfaceView的触摸监听返回点击落点位置,将其值传入

白平衡

用于矫正画满色温

param.getSupportedWhiteBalance()获取支持的模式

param.setWhiteBalance()

闪光灯

param.setFlashMode(Parameters.FLASH_MODE_OFF)

缩放

param.setZoom()

预览帧率

param.setPreviewFpsRange(min, max)

场景模式

param.setSceneMode()

色彩效果

param.setColorEffect()

Camera.Parameters.EFFECT_MONO 黑白

Camera.Parameters.EFFECT_NONE 无效果

。。。

 

最后通过camera.setParameters(param)完成配置。注意,由于兼容性问题,当设备不支持配置项时会发生配置失败,需放入trycatch中。

 

预览容器设置

mSurfaceView = (SurfaceView) findViewById(R.id.camera);

mSurfaceView.getHolder().addCallback(surfaceCallback);

SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {

      @Override

      public void surfaceCreated(SurfaceHolder holder) {//主线程回调

         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        camera.setPreviewDisplay(surfaceView.getHolder());    

 }



      @Override

      public void surfaceDestroyed(SurfaceHolder holder) {//主线程回调

camera.stopPreview();

camera.release();

camera = null;



      }



      @Override

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

      }

   };

 

完成

开启预览camera.startPreview();

 

调用系统相机完成拍照

mCamera.takePicture(null, null, jpegCallback)

 

预览数据获得

通过setPreviewCallbackWithBuffer(callback)设置循环回调的预览帧监听,实时获取数据。通常与addCallbackBuffer配合使用,避免频繁创建数组。

addCallbackBuffer也可以添加多个已避免单缓冲区卡顿。

### 3.1 问题分析 在使用Android Camera1 API时,手电筒(Flashlight)无法关闭的问题通常与相机参数的设置方式有关。Camera1 API提供了对闪光灯的基本控制,但开发者在实际操作中可能会遇到闪光灯无法正常关闭的情况,尤其是在不重新打开和关闭相机的情况下切换闪光灯状态时[^1]。 常见的问题原因包括: - 没有正确更新相机参数。 - 没有在调用`setFlashMode()`后调用`setParameters()`来应用更改。 - 未正确释放相机资源,导致状态异常。 ### 3.2 解决方案 要解决Camera1 API中闪光灯无法关闭的问题,应确保以下操作正确执行: - 获取当前相机参数,并修改闪光灯模式为`Camera.Parameters.FLASH_MODE_OFF`。 - 在修改参数后,调用`setParameters()`方法将更改应用到相机。 - 确保在操作前后没有遗漏对相机状态的检查,避免在预览未启动或相机未打开时调用相关方法。 示例代码如下: ```java Camera camera = Camera.open(); Camera.Parameters params = camera.getParameters(); params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); // 打开手电筒 camera.setParameters(params); // 在需要关闭手电筒时 params = camera.getParameters(); params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); // 关闭手电筒 camera.setParameters(params); ``` 如果在调用`setFlashMode()`后没有调用`setParameters()`,则闪光灯状态不会生效[^1]。 此外,需要注意不同设备厂商可能对闪光灯控制有特定的实现逻辑,因此在某些设备上可能需要额外的适配处理。 ### 3.3 注意事项 - 在调用`setParameters()`时,应捕获`RuntimeException`,因为某些设备可能在特定状态下不支持参数更改。 - 如果应用需要兼容Android 6.0(Marshmallow)及更高版本,建议使用Camera2 API以获得更稳定的闪光灯控制能力。 - 在切换闪光灯状态时,应确保相机处于预览状态,否则可能无法正确控制闪光灯。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值