Проблемы с поддержкой Android Camera Api и Camera2 Api

Я помогаю разработать приложение, которое должно поддерживать использование камеры во всех версиях 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 в отдельных фрагментах, но я действительно хотел бы знать, почему это не работает как есть.


person Droidio    schedule 13.11.2015    source источник
comment
Пожалуйста, обратитесь к этой странице stackoverflow.com/questions/10929546/   -  person Munro Chiang    schedule 14.03.2016
comment
Также сталкиваюсь с аналогичной проблемой. Есть прогресс?   -  person xceph    schedule 15.06.2016


Ответы (1)


Camera2 API работает только на устройствах с Android 5.0 и выше. Для устройств с Android 4.4 вам придется использовать устаревший API камеры. Дополнительную информацию можно найти здесь: https://developer.android.com/guide/topics/media/camera.html#considerations

person Martin Vasvari    schedule 23.03.2018