Android后向代码兼容性

时间:2011-02-02 11:21:48

标签: android backwards-compatibility

我正在开发一个使用

的应用
  

android.hardware.Camera.parameters.getSupportedPictureSizes()

这仅适用于SDK版本8,我希望与SDK 4兼容,所以我已经这样做了:

  

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

但是在模拟器上,它会尝试检查对此函数的引用,并且失败:

  

02-02 11:20:10.930:ERROR / dalvikvm(1841):找不到方法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 exists”但是“异常调用getRotation java.lang.NullPointerException。

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

您无法在API级别7及之前加载包含getSupportedPictureSizes()调用的代码。因此,在加载包含依赖于版本的语句的代码之前,您需要根据Build 做出决定。

您的选择包括:

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

后一种技术的示例可以在this sample project中看到,我支持API级别9的前向摄像头,但仍然可以在旧版本的Android上运行。

答案 1 :(得分:3)

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

这个问题的关键在于,您需要使用支持所需功能的API进行编译。否则你会收到错误。在Commonsware的示例中,首先在API级别9中支持前向摄像头,这是您必须在项目中指定的才能进行编译。然后,您可以使用上述其他技术来测试运行应用程序的操作系统是否实际支持您尝试使用的类和/或方法。如果您的应用程序在较旧版本的操作系统上运行,则调用将生成一个异常,您可以捕获该异常并对旧操作系统采取适当的操作。

为了完整起见,这里是我过去与API 7兼容的代码,即使我使用API​​ 8编译,其中包括ThumbnailUtils。

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);
   }
}