web-dev-qa-db-ja.com

非推奨のメモなしで新旧のAPIバージョンをサポートするためにAndroidのcameraまたはcamera2 APIを使用する方法

新しいcamera2 APIは私を混乱させます。デバイスのカメラを使用するアプリ(Android API 10 - 21用)を開発したいです。述べたように ここ 、私は "Camera" APIを使うべきです。

しかし、マニフェストのユーザー機能に「Camera」API(Android.hardware.Camera)を追加しようとすると、 廃止予定としてマークされています 。一方、「camera2」API(Android.hardware.camera2)には変更できません。AndroidAPI 21+(Android 5 - Lollipop)とのみ互換性があるためです。 - それもリンクしたはずですが、追加できるリンクは2つだけです。

自分のアプリを古いバージョンのAndroidで実行したいだけでなく、最新のAndroidでも実行できます。

130
Gee

古いカメラAPIは非推奨とマークされていますが、まだ完全に機能しており、しばらくの間そのままになります(Playストアのほとんどすべてのカメラ使用アプリケーションが現在それを使用しているため)。

あなたはそれが廃止予定であることについてのAndroid Studioの苦情を無視する必要がありますが、あなたが21より前のAndroidバージョンをサポートしたいのなら、あなたは古いAPIを使わなければなりません。

APIレベル21では、新しいAPIとその新機能を確実に使用できますが、現在APIを切り替える場合は、アプリケーション内でまったく別のフローを維持する必要があります。残念なことに、この2つのAPIは、古いデバイスでも新しいAPIのようなものを使用することを可能にするサポートライブラリを作成するのが難しいという世界観では十分に異なります。 API 21以降).

150
Eddy Talvala

必要なカメラのすべてのメソッドをインターフェイスに配置してから、このようなカメラインスタンスを作成します

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        Log.d(TAG, "camera2 selected");
        this.camera = new Camera2(getContext());
    } else {
        Log.d(TAG, "camera1 selected");
        this.camera = new Camera1(getContext());
    }

このようにして、すべてが分割され、人生がもっと楽になります。

アドバイスの言葉-camera2のある生活はそれほど素晴らしいものではありません。ベンダーはまだ実装を行わないため、多くの条件と回避策を追加する必要があります。

例1-S6は、フラッシュをサポートしていないことを報告します:)例2-LGデバイスは、サポートされているイメージサイズのリストを報告します-ただし、すべてが実際にサポートされているわけではありません!!

38
slott

必要なAPIをサポートするには、以下のコードを使用してください。 apiレベルに対応する適切な名前を決定するだけです。たとえば、API 21はLollipop、API 15はICE_CREAM_SANDWICH_MR1です。

 if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)  
                                    && ((Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop))) {
           // your code here - is between 15-21

 } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
           // your code here - is api 21
 }
9
user0770

ただし、Googleが推奨するのはCamera2 Api> = 21ですが、手動設定に問題がある可能性があります。

あなたが自動設定モードで写真を撮るためのアプリを実装する必要があるとき、それはうまく機能します。しかし!手動設定モードの実装でアプリを作成する必要がある場合は、APIが21以上のデバイス用に、まず、サポートされているハードウェアレベルの確認が必要です。

カメラ(正面、顔)を選択して特性を確認し、ハードウェアレベルを確認します。

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

CameraCharacteristicsは、次のサポートされているレベルを表します。LIMITED、FULL、LEGACY、LEVEL_3、EXTERNAL。

高レベルでは、レベルは次のとおりです。

LEGACYデバイスは、古いAndroidデバイスとの下位互換モードで動作し、機能が非常に限られています。

LIMITEDデバイスはベースライン機能セットを表し、FULLのサブセットである追加機能も含む場合があります。

FULLデバイスはさらに、センサー、フラッシュ、レンズ、後処理設定のフレームごとの手動制御、および高速での画像キャプチャをサポートします。

LEVEL_デバイスは、追加の出力ストリーム構成とともに、YUV再処理とRAW画像キャプチャもサポートします。

あなたがLEGACYサポートレベルを得たら、古いCamera Apiを使用してくださいするべきです。

2
Serj

サポートアノテーションを使う

    @TargetApi(21)

チェックを避けるために

1