1

サーフェス ビューを使用して、ユーザーにカメラ プレビューを表示しています。それを開始するための私の方法は次のとおりです。

private void pickCam(){
    if (Camera.getNumberOfCameras() < 1)
        return;

    if (Camera.getNumberOfCameras() == 1)
    {
        CameraInfo cInfo=new CameraInfo();
                Camera.getCameraInfo(0, cInfo);
    camera = Camera.open(0);

    }
    else
        camera = Camera.open(currentCamera);


    Camera.Parameters parameters = camera.getParameters();
    parameters = camera.getParameters();
    parameters.setRotation(90);
    try {

        Camera.Size mCameraSize = null;

        for (Camera.Size size : parameters.getSupportedPreviewSizes()) {


            if (size.width <= surfaceWidth && size.height <= surfaceHeight) {

                if (mCameraSize == null)
                    mCameraSize = size;
                else {

                    int currentArea = mCameraSize.width
                            * mCameraSize.height;
                    int newArea = size.width * size.height;

                    if (newArea > currentArea) {

                        mCameraSize = size;
                    }
                }
            }

        }
        parameters.setPreviewSize(mCameraSize.width, mCameraSize.height);

        camera.setParameters(parameters);

        camera.setDisplayOrientation(90);

        camera.setPreviewDisplay(surfaceHolder);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    camera.startPreview();
}

ユーザーがボタンをクリックすると:

if (camera != null)
camera.takePicture(null, null,this);

このコードは、Sony Xperia (2 台のカメラ) ではうまく機能しますが、HTC Wildfire と Samsung Galaxy S+ (両方とも 1 台のカメラ) ではプレビューが失敗します。スローされる例外はありません。何も表示されません。これらすべてのデバイスで写真を撮ることができます。

pickCamMethod の LogCat 出力は、両方のデバイスで空です。

04-23 14:25:22.987: I/System.out(5871): PickCamBegin 
04-23 14:25:23.428: I/System.out(5871): PickCamEnd 

すべての場合に機能させるにはどうすればよいですか?

4

2 に答える 2

1

あなたが言及したように、これらのデバイスHTC WildfireとSamsung Galaxy S +は、サポートしていない下位バージョンのAndroidで実行される可能性がありますCamera.getNumberOfCameras()

HTC Wildfireは2010年発表、Android 2.2(API Lv.8)まで対応

Samsung Galaxy S+、Android 2.3まで対応(API Lv.9/Lv.10)

API レベルのガイドは次の場所にあります: Android 開発者: API レベルとは?

したがって、使用しているメソッドCamera.getNumberOfCameras()は API 9 に追加されています (ドキュメントを参照してください) 。

Build.VERSIONそれらを個別に処理するために使用する必要があるかもしれないので、最初の行を次のpickCam()ように変更してみてください:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
// Means the device is using API Lv.9+
// Use the method that can work for Lv.9+
    if (Camera.getNumberOfCameras() < 1)
        return;

    if (Camera.getNumberOfCameras() == 1)
    {
        CameraInfo cInfo=new CameraInfo();
        Camera.getCameraInfo(0, cInfo);
        camera = Camera.open(0);

    }
    else
        camera = Camera.open(currentCamera);
} else {
// Use alternative method that support lower API levels
    camera = Camera.open();
}

Camera.open()は 2.2 で機能する方法で、Camera.open(int)2.3+ 用です (ドキュメントを参照) 。

これがうまくいくかどうか教えてください。

于 2013-04-23T12:34:17.787 に答える