API文档

根据Android开发人员指南CameraSupport,他们说:

我们建议将新的android.hardware.camera2 API用于新的应用程序。

在关于CameraSupport的信息页面(上面链接)中,声明:

android.hardware.camera2包为连接到Android设备的各个相机设备提供接口。 它取代了已弃用的Camera类。

问题

当您检查该文档时,您会发现这两个Camera API的实现非常不同。

例如,在CameraSupport上获取相机方向

@Override

public int getOrientation(final int cameraId) {

Camera.CameraInfo info = new Camera.CameraInfo();

Camera.getCameraInfo(cameraId, info);

return info.orientation;

}

Versus CameraSupport

@Override

public int getOrientation(final int cameraId) {

try {

CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);

String[] cameraIds = manager.getCameraIdList();

CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraIds[cameraId]);

return characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);

} catch (CameraAccessException e) {

// TODO handle error properly or pass it on

return 0;

}

}

这使得很难从一个切换到另一个并编写可以处理这两种实现的代码。

请注意,在这个单独的代码示例中,我已经不得不解决这样的事实:olde相机API使用CameraSupport基元用于相机ID,而新的适用于CameraNew对象。 对于这个例子,我通过在新API中使用int作为索引来快速修复它。 如果返回的相机并不总是以相同的顺序,则这将导致问题。 替代方法是使用String对象和旧int cameraIDs的String表示,这可能更安全。

一个人走了

现在要解决这个巨大的差异,您可以先实现一个接口,然后在代码中引用该接口。

在这里,我将列出该接口和2个实现的一些代码。 您可以将实现限制为实际使用相机API以限制工作量。

在下一节中,我将快速解释如何加载一个或另一个。

包装所有你需要的界面,为了限制这个例子我这里只有2个方法。

public interface CameraSupport {

CameraSupport open(int cameraId);

int getOrientation(int cameraId);

}

现在有一个老相机硬件api类:

@SuppressWarnings("deprecation")

public class CameraOld implements CameraSupport {

private Camera camera;

@Override

public CameraSupport open(final int cameraId) {

this.camera = Camera.open(cameraId);

return this;

}

@Override

public int getOrientation(final int cameraId) {

Camera.CameraInfo info = new Camera.CameraInfo();

Camera.getCameraInfo(cameraId, info);

return info.orientation;

}

}

另一个用于新硬件api:

public class CameraNew implements CameraSupport {

private CameraDevice camera;

private CameraManager manager;

public CameraNew(final Context context) {

this.manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);

}

@Override

public CameraSupport open(final int cameraId) {

try {

String[] cameraIds = manager.getCameraIdList();

manager.openCamera(cameraIds[cameraId], new CameraDevice.StateCallback() {

@Override

public void onOpened(CameraDevice camera) {

CameraNew.this.camera = camera;

}

@Override

public void onDisconnected(CameraDevice camera) {

CameraNew.this.camera = camera;

// TODO handle

}

@Override

public void onError(CameraDevice camera, int error) {

CameraNew.this.camera = camera;

// TODO handle

}

}, null);

} catch (Exception e) {

// TODO handle

}

return this;

}

@Override

public int getOrientation(final int cameraId) {

try {

String[] cameraIds = manager.getCameraIdList();

CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraIds[cameraId]);

return characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);

} catch (CameraAccessException e) {

// TODO handle

return 0;

}

}

}

加载适当的API

现在要加载您的CameraSupport或CameraNew类,您必须检查API级别,因为CameraNew仅可从api级别21获得。

如果已经设置了依赖项注入,则可以在提供CameraSupport实现时在模块中执行此操作。 例:

@Module public class CameraModule {

@Provides

CameraSupport provideCameraSupport(){

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

return new CameraNew(context);

} else {

return new CameraOld();

}

}

}

如果您不使用DI,您可以只使用实用程序或使用工厂模式来创建正确的。 重要的是检查API级别。

android camera 废弃,Android相机android.hardware.Camera已弃用相关推荐

  1. android官网自定义相机,android native.js camera自定义相机

    //js代码 //用代码渲染页面 let activity = plus.android.runtimeMainActivity(); let SurfaceView = plus.android.i ...

  2. 【Android适配问题集锦-相机类】Camera拍照时快门咔嚓声适配问题

    现在Android手机一般都会带有照相功能,有很多朋友就发现手机照相时快门声音很响,想关又关不掉.....不过话说回来,静音拍照你想做啥? 来到主题上,因为网络上有很多关于"删除或修改快门声 ...

  3. android有程序占用相机,Android相机 - 有时当我拍照时,应用程序冻结,相机不可用...

    我已经构建了一个应用程序,可以在您触摸预览时拍摄照片. 我可以拍很多照片,但有时当我触摸预览拍照时,没有快门声,整个应用程序冻结.此外,在此之后,如果我尝试启动内置相机应用程序,我会收到相机无法使用的 ...

  4. android 4.4原生相机,android—— cordova调用原生相机

    额..相关的下载和集成就不说了,直接说说怎么调用原生相机吧. 首先,先添加相关的插件 cordova plugin add cordova-plugin-camera 然后,瞅瞅自己插件有木有加进去 ...

  5. Android getResources()。getDrawable()已弃用API 22

    本文翻译自:Android getResources().getDrawable() deprecated API 22 With new android API 22 getResources(). ...

  6. camera (19)---Android 相机开发的基本流程

    [Android 相机]Android 相机开发的基本流程 https://blog.csdn.net/bluewindtalker/article/details/54563910 相机开发现在有2 ...

  7. 相机寻找最适合分辨率android,ARCore:获取相机的分辨率(ARCore : Get Camera's resolution)...

    ARCore:获取相机的分辨率(ARCore : Get Camera's resolution) 有没有办法获得相机的分辨率? (除非从头开始使用Android)我没有在session.setDis ...

  8. Android [Camera 源码] 相机 HAL3(Camera3) Google官方文档(二)

    Google源码网地址链接:https://source.android.com/devices/camera 该Google Camera的文档为系列文章,文章列表: overview Camera ...

  9. android.hardware.Camera类及其标准接口介绍

    android.hardware.Camera类及其标准接口介绍,API level 19 http://developer.android.com/reference/android/hardwar ...

最新文章

  1. ABAP中的Table Control编程
  2. Linux下Git和GitHub使用方法总结(Ubuntu16.04)
  3. 基于matplotlib的数据可视化 - 热图imshow
  4. 一个同事做的基于yaas平台的一个应用,可以用来学习SAP yaas
  5. HDU 3342 Legal or Not(拓扑排序)
  6. linux 批量替换
  7. 猴子选大王 (20 分)
  8. linux批量做信任,Linux 批量建立信任关系,实现ssh无password登陆的脚本
  9. Yearn V2 Vaults Swap发布,目前未经审核
  10. C# 如何 保存对config文件的修改
  11. 我的idea突然没有SVN了是怎么回事
  12. C#断点续传HTTP下载远程文件的方法
  13. 安全合规/法案--35--《APP收集使用个人信息自评估指南(征求意见稿)》原文及解读
  14. 2021年高压电工考试及高压电工考试资料
  15. 计算机自我鉴定高中生200字,精编高中生自我鉴定200字左右3篇 高中自我鉴定200字...
  16. matlab中codegen是什么,matlab中mcc编译器参数的含义
  17. 存储过程 生成拼音码与五笔码
  18. Jaeger知识点补充
  19. 腾讯外包抢5元红包被组长要回!格局决定高度。
  20. 《穷爸爸和富爸爸》读后感

热门文章

  1. 走近棒球运动·亚洲职棒大赛·MLB棒球创造营
  2. 16进制字符串转字节
  3. 工业机器人与计算机控制,不懂工业机器人控制技术?那你一定是没看过这篇文章...
  4. springboot 问题记录
  5. 量子计算核心突破!Shor算法实现或使密码成摆设
  6. swiper轮播图切换指示点改变背景颜色
  7. 学习python必逛的几个网站,没看过别说你想学好python
  8. SoapUI模拟服务端进行接口测试
  9. VMware虚拟化方案之备份ESXi虚拟机
  10. 数据结构实验-学生信息表