gpt4 book ai didi

android - 如何处理为新旧 Android 版本实现不同的 API?

转载 作者:搜寻专家 更新时间:2023-11-01 08:36:18 24 4
gpt4 key购买 nike

我正在编写一个应用程序,它对旧的 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();
}

在 Gingerbread 上运行时,我得到一个强制关闭:致命异常:main 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)

最佳答案

我在将 Camera2 功能添加到我的应用程序时遇到了这个问题。我不能权威地谈论底层机制,因为我只是通过反复试验来修复它,但通过测试我发现这个问题只发生在早于 Ice Cream Sandwich 左右的设备上,之后可以通过运行来避免它- 像您一样对 SDK 版本进行时间测试。似乎对于 ICS 及更高版本,只要您从不调用它,就可以在您的类中使用不受支持的 API,但在此之前,您需要确保您永远不会实例化使用不受支持的 API 调用的类,无论您是叫不叫。

我用这个方法解决了这个问题:

  • 创建一个调用您使用的 Camera2 API 函数的 Camera2Object 类(随意命名)。从所有其他类中删除 Lollipop+ Camera2 类的所有导入。可以在您的其他类中引用此 Camera2Object 类。
  • 仅在检查 API 版本 >= 21(Lollipop)或您的情况下为 Marshmallow 后创建此类的实例。
  • 在您当前在 API 版本检查 if 语句中调用 Camera2 函数的类中,更改您的代码以检查您的 Camera2Object 是否不为空,如果是,则调用一个方法来实现您在 if 中的功能声明。

您可能需要聪明一点并重新安排您的代码,以便所有 Camera2 内容都隐藏在此类中 - 您可能需要将返回代码等转换为不依赖于 Camera2 导入的内容,并可能返回整数或字符串作为对 Camera2 对象的引用,而不是在此类和应用的其余部分之间的边界来回转换。

如果 API 版本低于 21,您可以有多个调用 Camera2 函数的类,只要它们都不是实例即可。

这是在 2.3.3 设备上测试的,我不能保证 Gingerbread 的早期版本。我也不能保证您不需要为 ICS 和之后执行此操作。

关于android - 如何处理为新旧 Android 版本实现不同的 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36372666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com