我正在编写一个应用程序,它使用较旧的Android版本的旧相机API和适用于API 23及更高版本的新camera2 / torch API。 基本上我确定一次设备是否运行足够新的Android版本,然后根据它在实现之间切换。归结为:
private static final int SDK_VERSION = Build.VERSION.SDK_INT;
private boolean isSdkVersionGreaterThanOrEqualTo(final int sdk) {
return SDK_VERSION >= sdk;
}
if (marshmallowOrNewer) { //isSdkVersionGreaterThanOrEqualTo(23);
try {
cameraManager.setTorchMode(cameraManager.getCameraIdList()[0], true);
} catch (final CameraAccessException e) {
e.printStackTrace();
}
} else {
cameraParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(cameraParameters);
camera.startPreview();
}
在姜饼上跑步时,我得到一个力量关闭:致命异常:主要 java.lang.VerifyError的 在这一行:
toggleButton.setOnClickListener(new View.OnClickListener() {
打开包含上面代码的OnClickListener,并指出此版本的android不支持API方法,这是有道理的,但我实际上并没有在这里调用它。我应该如何正确处理这种情况,为不同的Android版本实现不同的API,或者如何绕过这种情况?
堆栈跟踪:
04-02 13:42:54.413 3815-3815/? E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.VerifyError: t.t.t.MainActivity$1
at t.t.t.MainActivity.onCreate(MainActivity.java:61)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
at android.app.ActivityThread.access$1500(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3835)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:3)
将Camera2功能添加到我的应用时遇到此问题。我不能权威地谈论底层机制,因为我只是通过反复试验来解决它,但通过测试我发现问题只发生在冰淇淋三明治之前的设备上,之后就可以通过运行来避免它像你正在做的SDK版本的时间测试。似乎对于ICS以及之后,可以在您的类中使用不受支持的API,只要您从不调用它,但早于您需要确保您永远不会实例化使用不受支持的API调用的类,无论您是否打电话。
我用这个方法解决了问题:
Camera2Object
类(根据需要命名),调用您使用的Camera2 API函数。从所有其他类中删除所有Lollipop + Camera2类的导入。可以在其他类中引用此Camera2Object
类。您可能需要有点聪明并重新排列代码,以便所有Camera2内容隐藏在此类中 - 您可能需要将返回代码等转换为不依赖于Camera2导入的内容,并可能返回int或者字符串作为对Camera2对象的引用,而不是在此类与应用程序其余部分之间的边界处来回转换。
如果API版本低于21,则可以有多个调用Camera2函数的类,只要它们都不是实例。
这是在2.3.3设备上测试的,我无法保证早期版本的Gingerbread。我也不能保证你不需要为ICS和之后做这件事。