Android&调用当前API没有的方法

时间:2012-06-07 09:56:48

标签: android api dalvik

如果我想获得这样的外部路径,并且设备具有Android 2.1(api 7)

        File f;
        int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
        if (sdkVersion >= 8) {
            System.out.println(">=8");
            f = getApplicationContext().getExternalFilesDir(null);
        } else {
            System.out.println("<=7");
            f = Environment.getExternalStorageDirectory();
        }

LogCat将显示:

05-25 15:44:08.355: W/dalvikvm(16688): VFY: unable to resolve virtual method 12: Landroid/content/Context;.getExternalFilesDir (Ljava/lang/String;)Ljava/io/File;

,但app不会粉碎。我想知道什么是VFY?虚拟机dalvik中是否存在检查被调用方法中的代码是否有效的内容?因为当前的proj再次编译Android 2.2所以Eclipse没有抱怨..但是在运行时,我得到了LogCat条目

PS:我真的不使用这样的方法,我有Helper类为API&lt; = 7或其他API初始化类&gt; = 8 ..但仍请回答!

1 个答案:

答案 0 :(得分:1)

是的,dalvik中的dex验证程序记录了VFY个错误。

您正面临此问题,因为您正在对SDK版本执行运行时检查并调用API方法。问题是即使方法调用在if(){}块内,这可能永远不会在较低的API级别执行,符号信息也会出现在生成的字节码中。如果需要执行特定于平台的函数调用,则需要使用反射。

File f;
int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
if (sdkVersion >= 8) {
    System.out.println(">=8");
    try {
        Method getExternalFilesDir = Context.class.getMethod("getExternalFilesDir",  new Class[] { String.class } );
        f = (File)getExternalFilesDir.invoke(getApplicationContext(), new Object[]{null});                  
    } catch (Exception e) {
        e.printStackTrace();
    } 

} else {
    System.out.println("<=7");
    f = Environment.getExternalStorageDirectory();
}