700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > android camera 废弃 Android相机android.hardware.Camera已弃用

android camera 废弃 Android相机android.hardware.Camera已弃用

时间:2019-10-24 18:40:27

相关推荐

android camera 废弃 Android相机android.hardware.Camera已弃用

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级别。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。