0

如果我想获得这样的外部路径,并且设备具有 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;

,但应用程序不会粉碎。我想知道什么是VFY?虚拟机 dalvik 中是否有一些东西可以检查被调用方法中的代码是否有效?因为当前项目是针对 Android 2.2 编译的,所以 Eclipse 没有抱怨.. 但在运行时,我得到了 LogCat 条目

PS:我真的不使用这样的方法,我有一个 Helper 类,它为 API<=7 或另一个为 API>=8 初始化一个类。但仍然请回答!

4

1 回答 1

1

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

您正面临此问题,因为您正在对 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();
}
于 2012-06-07T10:14:43.427 回答