Android后向代码兼容性

我正在开发一个使用的应用程序

android.hardware.Camera.parameters.getSupportedPictureSizes()

这只适用于SDK版本8,我想与SDK 4兼容,所以我这样做了:

if(Build.VERSION.SDK_INT> = 8){…}

但是在仿真器上,它试图检查对这个函数的引用,并且失败:

02-02 11:20:10.930:错误/ dalvikvm(1841):无法find方法android.hardware.Camera $ Parameters.getSupportedPictureSizes,从方法com.test.demo.CameraCustom.takeAPicture引用

任何关于如何解决这个向后兼容性问题的想法?

我已经尝试使用surfaceChanged内的这段代码的墨水位。 显然,代码可以直接运行而不需要调用:

try{ windowmanager_defaultdisplay_Rotation = getWindowManager().getDefaultDisplay().getClass().getMethod("getRotation"); Log.v(MainMenu.TAG, "getRotation exist"); }catch(Exception e){ Log.v(MainMenu.TAG, "getRotation dont exist"); } try{ windowmanager_defaultdisplay_Rotation.invoke(null, null); Log.v(MainMenu.TAG, "getRotation invoking ok, rotation "); }catch(Exception e){ Log.v(MainMenu.TAG, "exception invoking getRotation "+e.toString()); } 

我得到“getRotation存在”,然后“exception调用getRotation java.lang.NullPointerException。

任何想法?

您不能在API级别7和之前加载包含对getSupportedPictureSizes()调用的代码。 因此, 加载包含版本相关语句的代码之前 ,您需要根据Build来做出决定。

您的select包括:

  • 禁用菜单选项,button或任何导致使用getSupportedPictureSizes()的活动,基于API级别
  • 使用条件类加载或类似技术来加载基于API级别的合适实现,其中“合适的实现”仅在API级别8或更高级别上使用getSupportedPictureSizes()

后一种技术的例子可以在这个示例项目中看到,我支持API级别为9的前置摄像头,但仍然可以在旧版本的Android上运行。

好的,Commonsware提供的答案是正确的,特别是如果你研究他提供的优秀样本项目。 另外,当指向http://developer.android.com/resources/articles/backward-compatibility.html时,zegnus处于正确的轨道上

但是,从这个问题的答案来看,这个问题的关键在于,您需要使用支持所需function的API进行编译。 否则,你会得到错误。 在Commonsware的示例中,前向摄像机首先在API级别9中得到支持,这是您必须在项目中指定才能编译的。 然后,您可以使用上述其他技术来testing应用程序运行的操作系统实际上是否支持您尝试使用的类和/或方法。 如果您的应用程序在较早版本的操作系统上运行,则这些调用将生成一个exception,您可以对较旧的操作系统执行相应的操作。

为了完整起见,下面是我曾经与API 7兼容的代码,即使我使用包含ThumbnailUtils的API 8进行编译。

 import com.Flashum.util.WrapThumbnailUtils; public static Bitmap createVideoThumbnail(String filePath, int kind) { try { WrapThumbnailUtils.checkAvailable(); // will cause exception if ThumbnailUtils not supported return WrapThumbnailUtils.createVideoThumbnail(filePath, kind); } catch (Exception e) { return null; } } package com.Flashum.util; import android.graphics.Bitmap; import android.media.ThumbnailUtils; // To be compatible with Android 2.1 need to create // wrapper class for WrapThumbnailUtils. public class WrapThumbnailUtils { /* class initialization fails when this throws an exception */ static { try { Class.forName("android.media.ThumbnailUtils"); } catch (Exception ex) { throw new RuntimeException(ex); } } /* calling here forces class initialization */ public static void checkAvailable() {} public static Bitmap createVideoThumbnail(String filePath, int kind) { return ThumbnailUtils.createVideoThumbnail(filePath, kind); } }