Android 多版本Api适配
来源:互联网 发布:淘宝货源外国 编辑:程序博客网 时间:2024/04/30 09:30
背景:
Android从一开始发布到现在已经迭代了很多的版本了,其中一些API也经历了多次修改,比如开启相机之类的,在Android api 9之前相机开启就直接open了,但是Android Api 9之后,支持了多摄像头,为了相机的开启效率,将不推荐在直接使用open来开启相机了,而且在open时传递相机的ID以来区分具体开启哪颗摄像头。
这样在不同的Android版本下,可以就需要使用不同的api了。
适配方案:
不废话直接给出适配方案,以开启相机为例。
1、定义一个相机开启的接口
public interface OpenCameraInterface{ Camera open();}2、实现默认开启相机的接口
final class DefaultOpenCameraInterface implements OpenCameraInterface{ @Override public Camera open() { return Camera.open(); }}3、实现指定版本以上开启相机的接口
@TargetApi(9)public final class GingerbreadOpenCameraInterface implements OpenCameraInterface{ @Override public Camera open() { int numCameras = Camera.getNumberOfCameras(); if (numCameras == 0) { return null; } int index = 0; while (index < numCameras) { Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); Camera.getCameraInfo(index, cameraInfo); if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { break; } index++; } Camera camera; if (index < numCameras) { camera = Camera.open(index); } else { camera = Camera.open(0); } return camera; }}4、相机开启的管理类
public final class OpenCameraManager extends PlatformSupportManager<OpenCameraInterface>{ public OpenCameraManager() { super(OpenCameraInterface.class, new DefaultOpenCameraInterface()); addImplementationClass(9, GingerbreadOpenCameraInterface.class.getName()); }}
5、不同api适配管理类
public abstract class PlatformSupportManager<T>{ private final Class<T> managedInterface; private final T defaultImplementation; private final SortedMap<Integer, String> implementations; protected PlatformSupportManager(Class<T> managedInterface, T defaultImplementation) { if (!managedInterface.isInterface()) { throw new IllegalArgumentException(); } if (!managedInterface.isInstance(defaultImplementation)) { throw new IllegalArgumentException(); } this.managedInterface = managedInterface; this.defaultImplementation = defaultImplementation; this.implementations = new TreeMap<Integer, String>(Collections.reverseOrder()); } protected final void addImplementationClass(int minVersion, String className) { implementations.put(minVersion, className); } public final T build() { for (Integer minVersion : implementations.keySet()) { if (Build.VERSION.SDK_INT >= minVersion) { String className = implementations.get(minVersion); try { Class<? extends T> clazz = Class.forName(className).asSubclass(managedInterface); return clazz.getConstructor().newInstance(); } catch (ClassNotFoundException cnfe) { } catch (IllegalAccessException iae) { } catch (InstantiationException ie) { } catch (NoSuchMethodException nsme) { } catch (InvocationTargetException ite) { } } } return defaultImplementation; }}6、实际使用开启相机
Camera camera = new OpenCameraManager().build().open();
最后,这样可以适配多个版本下不同的api,且对于使用场景来说改动很小。
0 0
- Android 多版本Api适配
- Android API,版本对照
- ANDROID API 版本判断
- android更改api版本
- android api对应版本
- Android各个API版本
- Android API,版本对照
- android 更改api版本
- Android-Android API 版本判断
- Android 发布时间-平台版本-API版本
- Android SDK版本和API版本
- android工程更改api版本
- Android之API版本详解
- android工程更改api版本
- Android版本和API Level
- android尺寸以及API版本
- Android版本和API Level
- Android版本对应API Level
- Android个人学习小结2016.3
- PHP $_SERVER参数详解
- zabbix[1]-入门与初试2
- centos6.7环境下kvm虚拟机之virt-install和virsh及virt-manager工具的使用
- leetcode 151 Reverse Words in a String
- Android 多版本Api适配
- 【bzoj4567】[Scoi2016]背单词 贪心+trie树
- 洛谷【P1692】——部落卫队
- tcp 的一些问题
- poj2482 Stars in Your Window(成段更新+扫描线)
- microstation level2 0507
- iOS 属性声明在@implementation里与extension里的区别
- stl中的tuple(tie)
- Simple IOC 容器实现-基于注解