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
原创粉丝点击