4

非推奨のものを使用せずに、すべての Android バージョンでカメラの使用をサポートする必要があるアプリの開発を支援しています。これは明らかに、Android 5.0 以降 (Api レベル 21) 用の新しい Camera2 API を使用する必要があることを意味します。

今日、元のカメラ コードをすべて Camera2 API をサポートするように変換し、Build.VERSION.SDK_INT をチェックして元のコードをいつ使用し、いつ新しいコードを使用するかを決定しました。Android 4.xでテストに戻って何も壊れていないことを確認したときに、現在の問題が発生しました.java.lang.VerifyErrorを取得し、opcodeエラーを拒否しました-これまでに見たことのないものです。

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 と一緒に deprecated をサポートするのは初めてですが、かなり簡単に思えます。多分私は明らかに間違ったことをしていますか?

この時点で、コードが実際に実行されているかどうかに関係なく、Camera2 コードを含むアクティビティまたはフラグメントが Android 4.4 (および他のバージョンを想定) でクラッシュするため、かなりイライラしています。デバイス < 21 とデバイス > 21 のカメラ コードを別々のフラグメントに保持することで機能させることができると思いますが、これがそのまま機能しない理由を本当に知りたいです。

4

1 に答える 1