Я помогаю разработать приложение, которое должно поддерживать использование камеры во всех версиях Android без использования устаревших компонентов. Это, очевидно, означает, что мне нужно использовать новый API Camera2 для Android 5.0+ (уровень API 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
Это меня очень сбивает с толку, поскольку я никогда раньше не видел ошибок такого типа. Я тестировал это на двух разных устройствах Android 4.4. По общему признанию, я новичок в поддержке устаревших вместе с новыми API в одном приложении, но это кажется довольно простым. Может я что то делаю явно не так?
На данный момент я очень разочарован тем, что любое действие или фрагмент, содержащий код Camera2, вылетает на Android 4.4 (и я предполагаю, что другие версии) независимо от того, действительно ли выполняется код или нет. Я думаю, что смогу заставить его работать, сохранив код камеры для устройств ‹21 и устройств> 21 в отдельных фрагментах, но я действительно хотел бы знать, почему это не работает как есть.