85

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

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

Samsung SHW-M100S には 2 つのカメラがあります。2 台のカメラを使用するための参照がない場合、Samsung がどのように行ったかについて何か考えはありますか?

4

10 に答える 10

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

于 2011-01-22T12:36:50.977 に答える
14

API 21では 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 台のタブレットのようにまれな場合は、内蔵カメラの数を数え、その重要度 (「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"
于 2016-02-26T09:35:19.110 に答える
10

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

于 2010-05-07T11:56:09.313 に答える
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();
    }
}
于 2010-11-09T14:56:38.090 に答える
2

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

于 2010-12-06T16:33:29.143 に答える
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();
}

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

于 2013-03-28T11:59:10.327 に答える