2011-06-28 17 views
2

私はAndroidのCamera.open()メソッドを2つの別々のAPIレベルで使用したいと考えています。 1つ目はAPIレベル7、2.1以降、2.3.3 & 2.3.4はAPIレベル9です。複数のAPIレベルをターゲットに設定するにはどうすればよいですか?

APIレベル7および8では、Camera.openメソッドは引数をとりません。 APIレベル9以上では、カメラは使用するcameraIdに整数引数を渡します。

両方のAPIレベルを同じコードでどのようにターゲティングできますか?この擬似コードに類似したもの:

Camera lCamera; 
if (Platform.APILevel < 7){ 
    lCamera.open(); 
}else { 
    lCamera.open(0); 
} 

答えて

7

反射検出を頻繁に行います。以下のような何か:

public Camera getCamera() { 
     try { 
      Method method = Camera.class.getMethod("open", Integer.TYPE); 
      return (Camera) method.invoke(null, 0); 
     } catch (Exception e) { 
       // Yes, I really want to handle all exceptions here!!!! 
       Log.d(TAG,"Error when trying to invoke Camera.open(int), reverting to open()",e); 
       return Camera.open(); 
     } 
    } 
+0

絶対に受け入れます。 –

+0

:) Cool。反射が遅すぎるので、反射があまり頻繁に実行されない場合(カメラの検索はOKです)、非常に効果的です。別の興味深い方法もありますが、どういうわけか、それほど説得力がないと分かっています...あなたはEclipseプロジェクトに最新かつ最高のandroid-all-classes jarファイルをコンパイル(またはダウンロード)できます。上のようにExceptionでラップしてください...これは非常にうまくコンパイルされますが、実行時には例外が発生します。あなたが蟻のビルドをしたいのであれば、これは余分な複雑さを増やします。 ... –

+0

ちょっとフォローアップ... SDKの以前のバージョンで見つからないクラスを必要とするインポートステートメントについてはどうですか? –

2

一般的に言えば、離れていくことができる最も低いAPIレベルをターゲットにします。 APIレベル7用に作成されたものはすべて、APIレベル8,9,10などで機能します。この場合は、lCamera.open();と呼び出して、最初に見つかった背面カメラを選択します。フロントカメラを使用する場合は、上位レベルのAPIレベル9を使用する必要があります。

+0

- それ以降のバージョンでは 'invalidateOptionsMenu()'を呼び出す必要があります。より低いすべてのAPIバージョンでは、このメソッドは存在しないため、リフレクションを使用して呼び出すにはリフレクションを使用する必要があります。 – Graeme

2

あなたはfinal static整数android.os.Build.VERSION.SDK_INTを読み取ることにより、APIレベルを得ることができます。

マニフェストでandroid:minSdkVersionandroid:targetSdkVersionを設定してください。

+0

良い情報ですが、答えではありません。 –

+0

これはまた、必要とされる最高レベルのAPIを常にターゲットにして、必要な最高のAPIレベルでサポートされていない領域をラップすることによっても役立ちます。 APIレベルを下げるために何を変更する必要があるかを確認する唯一の方法は、プロジェクトのターゲットビルドを継続的に変更することです。 –

+0

'申し訳ありませんが、私はあなたが' Platform.APILevel'を実装する方法を探していると思いました。 – Computerish

関連する問題