支持Android Camera Api和Camera2 Api的问题

我正在帮助开发一个应用程序,需要支持所有 Android版本的相机使用,而不使用任何弃用的东西.这显然意味着我需要使用Android 5.0的新Camera2 API(Api Level 21).

今天我转换了所有原始相机代码以支持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一起弃用,但似乎相当简单.也许我做的事情显然是错的?

在这一点上,我非常沮丧,因为任何包含Camera2代码的Activity或片段在Android 4.4上崩溃(我假设其他版本),无论代码是否实际运行.我想我可以通过保持设备的摄像头代码来使其工作< <21和设备> 21在单独的片段中但我真的想知道为什么这不起作用.

最佳答案 Camera2 API仅适用于安装了Android 5.0及更高版本的设备.对于使用Android 4.4的设备,您必须使用已弃用的Camera API.您可以在此处找到更多信息: https://developer.android.com/guide/topics/media/camera.html#considerations

点赞