如果我想获得这样的外部路径,并且设备具有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 ..但仍请回答!答案 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();
}