1

ここに簡単なコードがありますが、何らかの理由でデータが保存されていません。ばかげていると思いますが、理解できないようです。どんな助けでも大歓迎です。

    private byte[] picture;

    public void takePicture(){
    Camera camera = Camera.open();
    Camera.Parameters parameters = camera.getParameters();
    parameters.set("camera-id",2);
            camera.setParameters(parameters);
    parameters.set("gps-timestamp", "1233744883");
    camera.setParameters(parameters);
    Log.i("method", "in takePicture()");
    camera.takePicture(null, rawCallback, null);
    camera.release();
}

    PictureCallback rawCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
    // TODO Do something with the image RAW data.
        Log.i("rawcallback", "in rawcallback");
        picture = data;
    }
};

コードを実行すると、コールバックのログインが呼び出されず、「画像」が「データ」を保存しません。何かご意見は?正面カメラで写真を撮ろうとしていますが、特別なものが必要ですか?

私もこれらの権限を持っています

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

2 に答える 2

2

の最後のパラメータはCamera.takePicture()JPEG コールバックに対応します。parameters.setPictureFormat(PixelFormat.JPEG);したがって、 camera.setParameters() 呼び出しの前に行を追加する必要があります。またはcamera.takePicture(null, rawCallback, null);代わりに使用します。

また、 AndroidManifest.xmlに次の行があることを確認する必要があります。

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

私のコメントから:

フォント向きのカメラにアクセスするためのAPIは、Android 2.3 (API バージョン 9) でのみ登場しました。以前のバージョンでは、ベンダー固有の手法を使用する必要があります。Galaxy S のこの実用的なソリューションを見てください。

Camera.Parameters parameters = mCamera.getParameters();
parameters.set("camera-id", 2);
parameters.setPreviewSize(640, 480); // or (800,480) this is supported front camera preview size @ Samsung Galaxy S
mCamera.setParameters(parameters);

お役に立てば幸いです。setPreviewSizeそうでない場合は、上記のパラメーターを試してみてください。

于 2011-03-16T22:06:22.213 に答える
1

JPEG コールバックでも同様の問題が発生しました。写真を撮った後に常に呼び出されるとは限りませんでした。これは、カメラを離すのが早すぎることが原因である可能性があります。

カメラを解放するかアプリを終了する前に、すべてのコールバックが返されるのを待つ必要があります。Camera クラスはスレッドセーフではありません。コールバックは、スレッドopen(int)が呼び出されたイベントで呼び出されます。(ドキュメントを参照)

関数を使用して JPEG の品質を下げ、setJpegQuality()計算するデータを減らすことで、より頻繁に呼び出されるようにしました。しかし、より良い方法は、コールバックが返されるまで待つことです。

Android コードのドキュメントによると、SurfaceHolder を Camera に渡し、写真を撮る前にプレビューを開始する必要もあります。私の目的のために、ユーザー画面でプレビューなしで写真を撮りたかったのです。ローカルの SurfaceView を使用しましたが、別のものを使用できます。

私は次のようなものを提案します:

Camera.PictureCallback myPictureCallback_jpeg = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] imageData, Camera c) {
            //save your data
        }
    };

    SurfaceView mySurfaceView = new SurfaceView(this);
    SurfaceHolder mySurfaceHolder = mySurfaceView.getHolder();
    Camera  myCamera = Camera.open();

    try {
        myCamera.setPreviewDisplay(mySurfaceHolder);
    } catch (IOException e) {
        e.printStackTrace();
    }
    Camera.Parameters p = myCamera.getParameters();
    p.setJpegQuality(70);//a value between 1 and 100
    myCamera.setParameters(p);
    myCamera.startPreview();
    myCamera.takePicture(null, null, null, myPictureCallback_jpeg);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    myCamera.release();
于 2011-05-05T16:04:41.737 に答える