2016-04-02 14 views
2

古いAndroidのバージョン用の古いカメラAPIと、23以上の新しいcamera2/torch APIを使用するアプリを作成しています。 基本的には、デバイスが十分な数の新しいAndroidバージョンを実行しているかどうかを一度判定し、それに応じて実装を切り替えます。それはこれに沸く:古いバージョンと新しいAndroidバージョンで異なるAPIを実装する方法を処理するにはどうすればよいですか?

private static final int SDK_VERSION = Build.VERSION.SDK_INT; 

private boolean isSdkVersionGreaterThanOrEqualTo(final int sdk) { 
    return SDK_VERSION >= sdk; 
} 

if (marshmallowOrNewer) { //isSdkVersionGreaterThanOrEqualTo(23); 
          try { 
           cameraManager.setTorchMode(cameraManager.getCameraIdList()[0], true); 
          } catch (final CameraAccessException e) { 
           e.printStackTrace(); 
          } 
         } else { 
          cameraParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
          camera.setParameters(cameraParameters); 
          camera.startPreview(); 
         } 

ジンジャーブレッド上で動作している時に私は近い力を得る:致命的な例外:この行の主な にjava.lang.VerifyError :

toggleButton.setOnClickListener(new View.OnClickListener() { 

OnClickListenerを開きますこれは上記のコードを含んでおり、このバージョンのAndroidではAPIメソッドがサポートされていないことを示していますが、実際にはここでは呼び出さないのです。この状況を適切に処理し、Androidバージョンごとに異なるAPIを実装するにはどうすればよいのですか?またはこの問題を回避するにはどうすればよいですか?

スタックトレース:

04-02 13:42:54.413 3815-3815/? E/AndroidRuntime: FATAL EXCEPTION: main 
               java.lang.VerifyError: t.t.t.MainActivity$1 
                at t.t.t.MainActivity.onCreate(MainActivity.java:61) 
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
                at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
                at android.os.Handler.dispatchMessage(Handler.java:99) 
                at android.os.Looper.loop(Looper.java:130) 
                at android.app.ActivityThread.main(ActivityThread.java:3835) 
                at java.lang.reflect.Method.invokeNative(Native Method) 
                at java.lang.reflect.Method.invoke(Method.java:507) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) 
                at dalvik.system.NativeStart.main(Native Method) 
+1

スタックトレースを送信してください。 – CommonsWare

+0

stacktraceを追加しました。 –

+1

あなたの問題はメソッドを呼び出すことではありません。AFAIK、それは 't.t.t.MainActivity $ 1'のいくつかのインターフェースまたはスーパークラスにあります。 't.t.t.MainActivity $ 1'は' View.OnClickListener() 'ですか?近くに他の匿名のインナークラスがありますか? 'View.OnClickListener'はAPIレベル1以降であり、' VerifyError'のソースではないようです。 – CommonsWare

答えて

2

私のアプリにカメラ2の機能を追加するとき、私は、この問題が発生しました。試行錯誤だけで修正されているため、根本的なメカニズムについては正式には言えませんが、テストでは、アイスクリームサンドイッチ以上のデバイスでしか問題が発生していないことが判明しました。あなたが行っているようなSDKのバージョンのための時間テスト。 ICS以降では、コールしない限り、サポートされていないAPIをクラス内で使用することは可能ですが、サポートされていないAPI呼び出しを使用するクラスを決してインスタンス化しないようにする必要があります。それを呼び出すかどうか。

私はこの方法の問題点固定:

  • を使用するカメラ2のAPI関数を呼び出すCamera2Objectクラスを(あなたが好きな名前を付け)を作成します。 Lollipop + Camera2クラスのすべてのインポートを他のすべてのクラスから削除します。このCamera2Objectクラスへの参照をあなたの他のクラスに持つことは大丈夫です。
  • APIバージョンが> = 21(Lollipop)であること、またはあなたのケースでMarshmallowであることを確認した後で、このクラスのインスタンスを作成してください。
  • 現在、APIバージョンのif文でCamera2関数を呼び出しているクラスで、Camera2Objectがnullでないかどうかを確認するコードを変更し、そうであればifの中にある機能を実装するメソッドを呼び出しますステートメント。

コードを少し巧みに再配置して、すべてのCamera2の内容がこのクラス内に隠されるようにする必要があります。戻りコードなどをCamera2の読み込みに依存しないものに変換する必要があります。おそらくintsまたはStringsをCamera2オブジェクトへの参照として返し、代わりにこのクラスと他のアプリケーションの境界で前後に翻訳されます。

あなたは、私は、APIのバージョンが未満21

ある場合限り、それらのどれもが今までの事例ではないので、これは2.3.3デバイス上でテストされ、カメラ2の関数を呼び出す複数のクラスをすることができますことができますGingerbreadの以前のバージョンを保証しません。また、ICS以降ではこれを行う必要がないことを保証するものでもありません。

+0

それはかなり変だ。試してみます。 –

+1

それを信じて、私はできません。 ありがとう、仲間、これはそれを修正しました。 –

+1

うわー、あなたは速いです!このように私のコードをリファクタリングするのは、午後の最高の部分でした。喜んで助けた – samgak

関連する問題