Androidプラットフォームで「フロントカメラ」を開くにはどうすればよいですか?


82

より一般的には、デバイスに複数のカメラが組み込まれている場合、特にそれらの1つを初期化する方法はありますか?

Androidのリファレンスドキュメントで見つかりませんでした:

SamsungSHW-M100Sには2台のカメラがあります。2台のカメラを使用するという言及がない場合、Samsungがどのように行ったのか考えてみてください...?


回答:


114
private Camera openFrontFacingCameraGingerbread() {
    int cameraCount = 0;
    Camera cam = null;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
        Camera.getCameraInfo(camIdx, cameraInfo);
        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            try {
                cam = Camera.open(camIdx);
            } catch (RuntimeException e) {
                Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
            }
        }
    }

    return cam;
}

AndroidManifest.xmlファイルに次の権限を追加します。

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.front" android:required="false" />

注:この機能は、Gingerbread(2.3)以降のAndroidバージョンで使用できます。


Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);既存のカメラアプリを開くテクニックでこれをどうにかして使用することは可能ですか?
loeschg 2013年

3
@loeschgIntentは、独自の方法でカメラアクションを処理します。この手法はSurfaceView、カメラ機能を活用するために使用している場合に使用されます。

それが私が考えたものです。ありがとう!
loeschg 2013年

2
とてもクールな投稿。カメラの向きが必ずしもカメラのインデックスと同じではないことを理解するのに少し時間がかかりました。たとえば、私のタブレットにはカメラが1つしかありませんが(インデックス:0)、正面を向いています(インデックス:1を向いています)。したがって、Camera.open(CameraInfo.CAMERA_FACING_FRONT)のような単純なコードを使用することは意味がありません。
マティアス

@Matthiasあなたの仲間に同意します。OEMが異なるため、プログラミング手法は必要に応じて変更されます。ハイライトしていただきありがとうございます。

14

API 21以降、Camera 2 APIを使用する必要があるため、古い回答のメソッドはすべてGoogleによって非推奨になっています(おそらくこのような問題が原因です)。

このクラスはAPIレベル21で非推奨になりました。新しいアプリケーションには新しいandroid.hardware.camera2APIを使用することをお勧めします。

では、新しいAPIあなたが持っているほぼ完全に電源のAndroidデバイスのカメラやドキュメントに明示的にアドバイスオーバー

String[] getCameraIdList()

次に、取得したCameraIdを使用してカメラを開きます。

void openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler)

これによると、正面カメラの99%はid = "1"であり、背面カメラID = "0" です。

取り外し不可能なカメラは、識別子に0から始まる整数を使用しますが、取り外し可能なカメラは、同じモデルであっても、個々のデバイスごとに一意の識別子を持ちます。

ただし、これは、デバイスの状況が1前面カメラタブレットのようにまれな場合は、内蔵カメラの数を数え、その重要度( "0")でカメラを並べ替える必要があることを意味します。したがって、CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0です。これは、前面よりも背面のカメラの方が重要であることを意味します。

すべてのAndroidデバイスで正面カメラを識別するための統一された方法についてはわかりません。簡単に言うと、デバイス内のAndroid OSは、何らかの理由でどのカメラが正確にどこにあるかを実際に見つけることができません。カメラのハードコードされたIDは、その重要性を表す整数であるか、一部のデバイスではどちら側を向いても..」バック"。

ドキュメントhttps//developer.android.com/reference/android/hardware/camera2/package-summary.html

明示的な例https//github.com/googlesamples/android-Camera2Basic


古いAPIの場合(新しいAndroidバージョンの最新の電話では機能せず、転送は非常に面倒なので、お勧めしません)。この回答のように、同じ整数のCameraID(1)を使用して正面カメラを開きます

cam = Camera.open(1);

OpenCVがカメラ部分を実行することを信頼している場合:

内部

    <org.opencv.android.JavaCameraView
    ../>

正面カメラには以下を使用します。

        opencv:camera_id="1"

10

Android 2.1以降、AndroidはSDKで1台のカメラのみをサポートします。これは、将来のAndroidリリースで追加される可能性があります。


1
このステートメントはAndroid2.2にも有効ですか?
ozmank 2012

2
@ozmank:はい、Android2.3までマルチカメラサポートは追加されませんでした。
CommonsWare 2012

4
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera = Camera.open();
        mCamera.setDisplayOrientation(90);
        mCamera.setPreviewDisplay(holder);

        Camera.Parameters p = mCamera.getParameters();
        p.set("camera-id",2);
        mCamera.setParameters(p);   
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

3
Galaxy Sでうまく機能している重要な「camera_id」ではなく「camera-id」
Mahesh

3
90度でポートレートの正しい回転が得られると思い込まないでください。多くのデバイスで異なります。
colintheshots 2016年

4

API 21(5.0)以降では、CameraManagerAPIを使用できます。

try {
    String desiredCameraId = null;
    for(String cameraId : mCameraIDsList) {
        CameraCharacteristics chars =  mCameraManager.getCameraCharacteristics(cameraId);
        List<CameraCharacteristics.Key<?>> keys = chars.getKeys();
        try {
            if(CameraCharacteristics.LENS_FACING_FRONT == chars.get(CameraCharacteristics.LENS_FACING)) {
               // This is the one we want.
               desiredCameraId = cameraId;
               break;
            }
        } catch(IllegalArgumentException e) {
            // This key not implemented, which is a bit of a pain. Either guess - assume the first one
            // is rear, second one is front, or give up.
        }
    }
}

4

バックカメラを開くには:-

val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)

フロントカメラを開くには:-

val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
when {
     Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.O -> {
         cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT)  // Tested on API 24 Android version 7.0(Samsung S6)
     }
     Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
         cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT) // Tested on API 27 Android version 8.0(Nexus 6P)
         cameraIntent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true)
     }
     else -> cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", 1)  // Tested API 21 Android version 5.0.1(Samsung S4)
}
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)

API28以降では動作させることができませんでした。また、一部のデバイスではフロントカメラを直接開くことができません(メーカーによって異なります)。


2

Android 2.3(Gingerbread)のリリースにより、android.hardware.Cameraクラスを使用してカメラの数、特定のカメラに関する情報を取得し、特定のへの参照を取得できるようになりましたCameraここで新しいCameraAPIを確認してください。


1

build.gradle

 dependencies {
       compile 'com.google.android.gms:play-services-vision:9.4.0+'
    }

ビューを設定

CameraSourcePreview mPreview = (CameraSourcePreview) findViewById(R.id.preview);

GraphicOverlay mGraphicOverlay = (GraphicOverlay) findViewById(R.id.faceOverlay);

CameraSource mCameraSource = new CameraSource.Builder(context, detector)
                            .setRequestedPreviewSize(640, 480)
                            .setFacing(CameraSource.CAMERA_FACING_FRONT)
                            .setRequestedFps(30.0f)
                            .build();

           mPreview.start(mCameraSource, mGraphicOverlay);

0
Camera camera;   
if (Camera.getNumberOfCameras() >= 2) {

    //if you want to open front facing camera use this line   
    camera = Camera.open(CameraInfo.CAMERA_FACING_FRONT);

    //if you want to use the back facing camera
    camera = Camera.open(CameraInfo.CAMERA_FACING_BACK);                
}

try {
    camera.setPreviewDisplay("your surface holder here");
    camera.startPreview();      
} catch (Exception e) {  
    camera.release();
}

/ *これは適切な方法ではありません。これは、Android4.0以前を実行する古いデバイス向けのソリューションです。これはテスト目的で使用できますが、メインの開発にはお勧めしません。このソリューションは、一時的なソリューションとしてのみ見なすことができます。しかし、この解決策は多くの人を助けたので、私はこの答えを削除するつもりはありません* /


7
文書化された使用法ではないと思います。open(int id)は、カメラの位置ではなくIDを受け入れます
XY

13
この誤解を招く答えを削除してください
Alex Cohn 2014年

13
@AmalanDhananjayan:たとえば、上記の@Matthias によるコメントを参照してください:…カメラの向きがカメラのインデックスと必ずしも同じではないことを理解するためにしばらく時間がかかります。たとえば、私のタブレットにはカメラが1つしかありませんが(インデックス:0)、正面を向いています(インデックス:1を向いています)。したがって、Camera.open(CameraInfo.CAMERA_FACING_FRONT)のような単純なコードを使用することは意味がありません。
Alex Cohn 2014年

5
これはバルダーダッシュです。これを使おうとさえしないでください。
アダム

4
これは恐ろしいです。これは絶対に行わないでください。この答えは禁止されるべきです。Camera.open()は、カメラの向きの序数ではなく、カメラIDを受け入れます。これは、かなりの少数のデバイスで失敗し、まったくの運が悪かった場合にのみ機能します。
colintheshots 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.