我正在帮助开发一个应用程序,该应用程序需要支持所有 android 版本的相机使用,而不使用任何已弃用的东西。这显然意味着我需要为 Android 5.0+(Api Level 21)使用新的 Camera2 API。
今天我转换了我们所有的原始相机代码以支持 Camera2 API,检查 Build.VERSION.SDK_INT 以决定何时使用原始代码以及何时使用新代码。当我回到 android 4.x 上进行测试以确保没有损坏时,我当前的问题出现了,我收到了 java.lang.VerifyError 并拒绝了操作码错误——这是我以前从未见过的。
我把我的问题归结为不明白为什么以下代码在 Android 4.4 上运行时会崩溃:
public class CameraActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
}
void thisIsNeverRun()
{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
// set to null so we can compile and run easily.
// Doesn't Matter as the code is never actually executed
CameraDevice d = null;
// calling getId as an example, anything will break it
d.getId();
}
}
}
注意thisIsNeverRun()永远不会被调用。在 android 4.4 设备上运行时会发生崩溃,并且 logcat 会产生以下输出:
11-12 20:46:21.336 5875-5875/com.example.android.camera2basic I/dalvikvm: Could not find method android.hardware.camera2.CameraDevice.getId, referenced from method com.example.android.camera2basic.CameraActivity.thisIsNeverRun
11-12 20:46:21.336 5875-5875/com.example.android.camera2basic W/dalvikvm: VFY: unable to resolve virtual method 689: Landroid/hardware/camera2/CameraDevice;.getId ()Ljava/lang/String; 11-12 20:46:21.336 5875-5875/com.example.android.camera2basic W/dalvikvm: VFY: rejecting opcode 0x6e at 0x0007
11-12 20:46:21.336 5875-5875/com.example.android.camera2basic W/dalvikvm: VFY: rejected Lcom/example/android/camera2basic/CameraActivity;.thisIsNeverRun ()V
11-12 20:46:21.336 5875-5875/com.example.android.camera2basic W/dalvikvm: Verifier rejected class Lcom/example/android/camera2basic/CameraActivity;
11-12 20:46:21.336 5875-5875/com.example.android.camera2basic W/dalvikvm: Class init failed in newInstance call (Lcom/example/android/camera2basic/CameraActivity;)
11-12 20:46:21.336 5875-5875/com.example.android.camera2basic D/AndroidRuntime: Shutting down VM
11-12 20:46:21.336 5875-5875/com.example.android.camera2basic W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41c7bdb8)
11-12 20:46:21.336 5875-5875/com.example.android.camera2basic E/AndroidRuntime: FATAL EXCEPTION: main
11-12 20:46:21.336 5875-5875/com.example.android.camera2basic E/AndroidRuntime: Process: com.example.android.camera2basic, PID: 5875
11-12 20:46:21.336 5875-5875/com.example.android.camera2basic E/AndroidRuntime: java.lang.VerifyError: com/example/android/camera2basic/CameraActivity
这让我很困惑,因为我以前从未见过这些类型的错误。我已经在 2 个不同的 android 4.4 设备上对此进行了测试。诚然,我对在同一个应用程序中支持已弃用的新 API 和新 API 很陌生,但它似乎相当简单。也许我在做一些明显错误的事情?
在这一点上,我非常沮丧,因为任何包含 Camera2 代码的 Activity 或片段在 Android 4.4(我假设其他版本)上都会崩溃,无论代码是否实际运行。我想我可以通过将设备 < 21 和设备 > 21 的相机代码保存在单独的片段中来使其工作,但我真的很想知道为什么这不能正常工作。