2011-02-02 144 views
7

我开发使用Android的向后代码兼容性

android.hardware.Camera.parameters.getSupportedPictureSizes()

这只能从SDK版本8,我想一个应用程序后与SDK 4兼容,所以我这样做:

如果(Build.VERSION.SDK_INT> = 8){...}

但在模拟器上,它煤层,它试图检查参考这个功能,它失败:

11月2日至2日:20:10.930:ERROR/dalvikvm(1841):找不到方法android.hardware.Camera $ Parameters.getSupportedPictureSizes,从方法com.test.demo.CameraCustom.takeAPicture

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

我试着用这段代码在surfaceChanged里面使用这个代码。显然,代码工作的情况下直接invokation:

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存在”但随后“异常调用getRotation显示java.lang.NullPointerException

任何想法

回答

5

不能加载包含的代码?因此,您需要根据Build之前的决定,在之前加载包含版本相关语句的代码。

您的选项包括:

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

后一种技术的例子可以看出,在this sample project,其中I支持API级9朝前相机,但仍旧可以跑老Android的呃版本。

+0

是的,我认为我应该这样做:http://developer.android.com/resources/articles/backward-compatibility.html,谢谢! – zegnus 2011-02-02 16:24:58

3

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

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

为了完整起见,以下是我曾经与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); 
    } 
}