web-dev-qa-db-ja.com

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

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

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

Samsung SHW-M100Sには2つのカメラがあります。 2台のカメラを使用するという言及がない場合、サムスンがどのようにしたのか...?

82
Sol
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バージョンで使用できます。

113
user456118

API 21で se Camera 2 APIを使用する必要があるため、古い回答のすべてのメソッドはGoogleによって非推奨になりました(おそらくこのようなトラブルのため)。

このクラスはAPIレベル21で廃止されました。新しいアプリケーションには、新しいAndroid.hardware.camera2 APIを使用することをお勧めします。

新しいAPI で、あなたはほぼ完全なパワーをAndroidデバイスカメラとドキュメントに明示的にアドバイスしています。

String[] getCameraIdList()

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

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

99%の正面カメラはid = "1"で、これに応じて背面カメラid = "0"です。

非リムーバブルカメラは識別子に0から始まる整数を使用しますが、リムーバブルカメラは同じモデルであっても個々のデバイスごとに一意の識別子を持ちます。

ただし、、これは、デバイスの状況が1正面カメラカメラのようにまれな場合は、その数を数える必要があることを意味しますあなたが持っているembeddedカメラ、そしてその重要度( "0")によってカメラの順序を置きます。したがって、CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0です。これは、背面カメラが正面よりも重要であることを意味します。

すべてのAndroidデバイスで正面カメラを識別するためのuniformメソッドについて知りません。簡単に言うと、デバイス内のAndroid OSは、いくつかの理由でどのカメラが正確にどこにあるのかを実際に見つけることができません。ターンは..「戻る」になります。

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

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


古いAPIの場合(推奨されません。新しいAndroidバージョンの最新の携帯電話では機能せず、転送が面倒です-in-the-arse)。同じIntegerCameraID(1)を使用して、 この回答 のように正面カメラを開きます。

cam = Camera.open(1);

OpenCVを信頼してカメラ部分を行う場合:

内部

    <org.opencv.Android.JavaCameraView
    ../>

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

        opencv:camera_id="1"
12
iantonuk

Android 2.1の時点で、AndroidはSDKで単一のカメラのみをサポートしています。これは今後のAndroidリリースで追加される可能性があります。

10
CommonsWare
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();
    }
}
4
Mahesh

API 21(5.0)以降では、 CameraManager API's を使用できます

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
Airsource Ltd

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

2
Wesley Wiser

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);
1
Dheerendra Mitm
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();
}

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

0