16

私の要件は、カメラプレビューを表示することでも、画像キャプチャにカメラインテントを使用することでもありません。

そこで、最初のテストデバイス(Galaxyタブ7 ")で機能する方法を見つけました。

私のCaptureImage機能は以下の通りです

private void CaptureImage() {
        int FrontCameraFound = getCameraID();
        if (FrontCameraFound != -1) {
            mCamera = Camera.open(FrontCameraFound);

            parameters = mCamera.getParameters();

            mCamera.setParameters(parameters);
            mCamera.startPreview();

            Camera.PictureCallback mCall = new Camera.PictureCallback() {
                @Override
                public void onPictureTaken(byte[] data, Camera camera) {

                    bmp = BitmapFactory.decodeByteArray(data, 0, data.length);

                    // set bitmap tp image view just to check 
                    // if image capture proper, testing purpose
                    iv_image.setImageBitmap(bmp);

                    mCamera.stopPreview();
                    mCamera.release();
                    mCamera = null;
                }
            };
            mCamera.takePicture(null, null, mCall);
        }
    }

以下のようにgetCameraID機能します

private int getCameraID() {
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();

    for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); camIdx++) {
        Camera.getCameraInfo(camIdx, cameraInfo);
        // for capture image from back camera
        // If want to capture from front 
        // then change it to CAMERA_FACING_FRONT
        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
            try {
                return camIdx;
            } catch (RuntimeException e) {

            }
        }
    }
    return -1;
}

現在、さまざまなデバイスで上記のコードを正常に実行するのが困難になっています。

  • Samsung Galaxy S +(2.3.6):フロントカメラは常に緑色の画像を返しますが、バックカメラのコーディングは正常に機能します。
  • サムスンギャラクシーネクサス(4.1):コーディングがフロントカメラでもバックカメラでも機能せず、「takePicture」が失敗しました。
  • LG Optimus Net(2.3.4):バックカメラのみがあり、正常に動作しています。
  • Samsung Galaxy Tab 7 "(2.3.3):両方のカメラが正常に動作しています。
  • Motorola Xoom(3.1):両方のカメラが正常に動作しています。

サムスンギャラクシーネクサスのLogcat:

09-21 09:37:42.125: E/AndroidRuntime(4647): Caused by: java.lang.RuntimeException: takePicture failed
09-21 09:37:42.125: E/AndroidRuntime(4647):     at android.hardware.Camera.native_takePicture(Native Method)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at android.hardware.Camera.takePicture(Camera.java:1061)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at android.hardware.Camera.takePicture(Camera.java:1006)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at fortyonepost.com.pwop.TakePictureDemoActivity.CaptureImage(TakePictureDemoActivity.java:63)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at fortyonepost.com.pwop.TakePictureDemoActivity.onCreate(TakePictureDemoActivity.java:36)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at android.app.Activity.performCreate(Activity.java:5008)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
09-21 09:37:42.125: E/AndroidRuntime(4647):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)

すべてのデバイスのコードを確認することはできません。5つのデバイスでコードをテストするだけで、2つのデバイスで問題が発生するため、意図せずにプレビューせずにカメラから画像を取得する標準的な方法はありますか。

マニフェストに含めて、最小SDKバージョンを9に設定していることに注意してください

更新:takePicture Failed Camera.javaクラスの行番号1061の 4.1 Nexus Galaxyで、これをスローした情報を提供するクラスリンクを次に示します。native_takePicture(msgType); function in Camera.java

4

3 に答える 3

3

Android デバイスでのカメラの処理は主要な PITA です。異なるデバイス (および同じデバイス上の Android バージョンでさえ) は、異なる動作をする可能性があり、確実に異なります。基本的に、デバイス上のいくつかの悪魔のプロセスと話しているのですが、それらは互いに異なります。

すべての問題の解決策はありませんが、これまでの調査結果は次のとおりです

  • カメラのパラメーターでアドバタイズされていても、すべての解像度が適切に機能しているわけではありません。問題が発生した場合に備えて、カメラのセットアップ中にそれらをテストする必要があります
  • mmaped メモリ領域を介してプレビュー データが表示されます
  • NV21 形式が常に提供され、デフォルトになりますが、カメラの設定を照会します。カメラを開くと、直前にカメラを使用した他のアプリケーションの設定がいくつか含まれている場合があります。(カメラを開くとデフォルトにリセットされるとはどこにも言われていません)

JavaOCR プロジェクト用に開発されたカメラ管理機能をいくつか開発しましたが、ほとんどのデバイスで動作します。これをインスピレーションとして自由に使用してください。

http://sourceforge.net/p/javaocr/code/240/tree/trunk/demos/camera-utils/src/main/java/net/sf/javaocr/demos/android/utils/camera/CameraManager.java

于 2012-09-26T08:39:49.533 に答える
3

何度か検索した結果、カメラのプレビューが必要であることがわかりました。一部のデバイスでは、コードに問題があっても、どのように機能するのだろうかと思います。

どんな方法でも解決策はそれです、

サーフェス ビューでカメラ プレビューを保持する必要があり、そのサーフェス ビューを他のビューの背後に隠すことができます。 30*30 dp のような小さなサーフェス ビューが機能せず、再びエラーが発生したため、dp サーフェス ビュー。

于 2012-10-03T10:44:21.783 に答える
1

Camera.setOneShotPreviewCallback メソッドを使用してから、画像を処理する必要があります

次のように、YuvImage を使用して圧縮してから bitmapfactory に渡します。

YuvImage yuvimage = new YuvImage(byteArr, ImageFormat.NV21, width, height, null);
    Rect rect = new Rect(0, 0, width, height);
    ByteArrayOutputStream outstr = new ByteArrayOutputStream();
    yuvimage.compressToJpeg(rect, 100, outstr);
    Bitmap bm = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());

編集:

サーフェス ビューを使用する必要がありますが、サーフェス ビューは別のビューの下に隠すことができるため、画面には表示されませんが、存在してアクティブになっています。

于 2012-10-01T20:38:31.530 に答える