支持 Android Camera Api 和 Camera2 Api 的问题

Posted

技术标签:

【中文标题】支持 Android Camera Api 和 Camera2 Api 的问题【英文标题】:Problems supporting Android Camera Api and Camera2 Api 【发布时间】:2016-02-14 14:56:14 【问题描述】:

我正在帮助开发一个应用程序,该应用程序需要支持所有 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 的相机代码保存在单独的片段中来使其工作,但我真的很想知道为什么这不能正常工作。

【问题讨论】:

请参考本页***.com/questions/10929546/… 也遇到了类似的问题。有什么进展吗? 【参考方案1】:

Camera2 API 仅适用于 Android 5.0 及更高版本的设备。对于搭载 Android 4.4 的设备,您必须使用已弃用的 Camera API。你可以在这里找到更多信息:https://developer.android.com/guide/topics/media/camera.html#considerations

【讨论】:

以上是关于支持 Android Camera Api 和 Camera2 Api 的问题的主要内容,如果未能解决你的问题,请参考以下文章

Camera1 API详解

Camera1 API详解

Camera1 API详解

Camera1 API使用规范

如何实现RTMP推送Android Camera2数据

Android Camera API/Camera2 API 相机预览及滤镜贴纸等处理