Androidのカメラまたはcamera2 APIを使用して、廃止予定のメモなしで新旧のAPIバージョンをサポートする方法


135

新しいcamera2 APIは私を混乱させます。デバイスのカメラを使用するアプリ(Android API 10〜21用)を開発したい。ここで述べように、「カメラ」APIを使用する必要があります。

しかし、「カメラ」API (android.hardware.Camera)をマニフェストのユーザー機能に追加しようとすると、非推奨としてマークされます。一方、「camera2」API (android.hardware.camera2)に変更することはできません。これは、Android API 21+(Android 5-Lollipop)とのみ互換性があるため、リンクすることもできますが、追加できるのは2リンク。

古いバージョンのAndroidだけでなく、最新バージョンのAndroidでもアプリを実行したい...

回答:


152

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

Android Studioの非推奨に関する不満は無視する必要がありますが、21より前のAndroidバージョンをサポートする場合は、古いAPIを使用する必要があります。

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


1
いい答えだ。APIレベル16以上をサポートしたいのであれば、今のところ古いカメラに固執するほうがいいでしょう?
Loolooii

5
したがって、唯一の方法は、ifステートメントとandroid.os.Build.VERSION.SDK_INTを使用してコードを分離することですか?
ハディ2015

開発者にとって、API 21以降のみを対象とする場合はCamera2を使用しますが、レガシーサポートが必要な場合はCameraを使用しますか?または、ビルドバージョンを検出し、異なるAPIを使用して2つの異なるメソッドをコーディングすることをお勧めしますか?
john.weland

2
それはあなたのアプリが何をするかに依存します。カメラの機能が簡単なポイントアンドシュート機能であり、古いAPIをターゲットにする場合は、古いカメラAPIを使用します。ただし、JPEGを取得してプレビューを描画するだけではない場合、または単に新しいAPIを対象とする場合は、camera2を使用してください。(難しい)真ん中には、camera2で豪華なオプション機能を提供したいが、古いデバイスでも動作するアプリがあります。そこで、APIごとに1つずつ、2つの個別のコードパスを構築する必要があります。
Eddy Talvala、2015

21
Camera APIの廃止は間違いでした。カメラの高度なAPI(本格的なカメラアプリなどの高度なアプリの場合)を導入する必要がありました。それ以外の場合、写真を撮るためだけにカメラを使用する(ほとんどの)アプリは2つのAPIを維持する必要があります。グーグルは(いつものように)少なくともコンパクトなライブラリを導入すべきだった
Sudara

38

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

    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デバイスはサポートされている画像サイズのリストを報告しますが、実際にはそれらすべてがサポートされているわけではありません!!


14
これは本当です。カメラ2 APIは実際にカメラデバイスを3つのカテゴリに分類します:LEGACY、LIMITED、FULL。カメラがLEGACYとして分類されている場合、すべてのcamera2 API呼び出しは内部でcamera1に変換されるため、実際に煩わしいことはありません。私の提案はCameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID); if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)... 、それが本当なら古いAPI を呼び出して選択することです。
panonski

9

必要な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
 }

33
これは、完全なカメラの実装にはほとんど実用的ではありません。さらに、2つのコードパスを維持する必要があります。バージョンチェックはAndroid開発で使用されますが、これはそうではありません。
カッツェンハット2015年

5
ユーザーがBuild.VERSION_CODES.LOLLIPOP_MR1を実行している場合はどうなりますか?またはその上の何か?2番目のチェックは「else if(Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)」
Ralph Pina

アプリが16以降のAPIで動作する必要がある場合、どうすれば同じAPKカメラ2と古いAPIをビルドできますか?フレーバーはこの作品に良いですか?
Mateus

両方のAPIを実装する必要があります。カメラの機能が実装されているインターフェースと2つのクラスを保持するだけです。カメラを実行するためのインスタンスの1つを作成する前に、上記のメソッドを呼び出して、呼び出すクラスと機能を見つけることができるようにします
user0770

3

ただし、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_3デバイスは、追加の出力ストリーム構成とともに、YUV再処理とRAW画像キャプチャを追加でサポートします。

LEGACY supprotレベルを取得した場合は、古いCamera Api使用する必要があります



0

Plz読み取りリンクカメラバージョンのサポート 彼らはそれを述べています...
カメラAPI1
Android 5.0はカメラAPI1を非推奨にしました。新しいプラットフォームの開発がカメラAPI2に焦点を合わせているため、カメラAPI1は段階的に廃止されます。ただし、段階的廃止期間は長くなり、AndroidのリリースはCamera API1アプリをしばらくの間サポートし続けます。具体的には、次のサポートが継続されます。

  • アプリのカメラAPI1インターフェイス。Camera API1の上に構築されたカメラアプリは、以前のAndroidリリースバージョンを実行しているデバイスと同じように機能します。
  • カメラHALバージョン。Camera HAL1.0のサポートが含まれます。

  • -1

    2つのアクティビティを作成するのが最善の方法であることがわかりました。一般的な方法で現在のデバイスAPIを確認する

    Intent i;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        i = new Intent(context,camera2.class)
    } else {
        i = new Intent(context,camera.class);
    }
    startActivity(i);

    このようにして、コードを振り返るときに、多くの混乱を感じる必要はありません。分離されているため、コードを変更するのは簡単です。

    弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
    Licensed under cc by-sa 3.0 with attribution required.