我正在帮助开发一个应用程序,需要支持所有 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.thisIsNeverRun11-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 0x000711-12 20:46:21.336 5875-5875/com.example.android.camera2basic
W/dalvikvm: VFY: rejected
Lcom/example/android/camera2basic/CameraActivity;.thisIsNeverRun ()V11-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 VM11-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: main11-12 20:46:21.336 5875-5875/com.example.android.camera2basic
E/AndroidRuntime: Process: com.example.android.camera2basic, PID: 587511-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