1

デバイス固有の問題だと思う問題に遭遇しましたが、他の誰かがこの動作を以前に見たことがあるかどうかを確認したいと思いました。以下は、カメラアクティビティでJPEGをキャプチャするために使用しているコードです。

surfaceView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        camera.autoFocus(new AutoFocusCallback() {

            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                if(success)
                {                           
                    Log.d(TAG, "Focusing...successful.");
                    camera.takePicture(null, null, null, jpegCallback);
                }
                else
                {
                    Log.d(TAG, "Focusing...failed.");
                }

            }

        });
    }
});

このコードはNexus4で完全に機能しますが、今日の午後、Samsung Galaxy S3で試してみたところ、カメラサーバーがクラッシュして次のエラーメッセージが表示されました。

Focusing...successful.
Camera server died!
ICamera died
Error 100

LogCatからわかるように、が呼び出されたときに障害が発生しますcamera.takePicture(...)(つまり、jpegCallbackが呼び出されることはありません)。後で私はそれを試すためにサムスンギャラクシーノートを持っている友人を手に入れました、そしてそれは彼らの電話でうまく働きます。

オートフォーカスコールバックの中から写真を撮るべきではありませんか?これはそれを置くのに適切な場所のようです。ここでの洞察は素晴らしいでしょう!

4

1 に答える 1

3

私はしばらく前にこれを理解し、これを修正する方法を他の人に知らせたかったのです。クラッシュの原因は、プレビューサイズをデバイスの画面サイズよりも大きく設定したことです。これが、Samsung Galaxy S3がクラッシュするが、Nexus 4はクラッシュしない理由です。以下は、私が変更した関連コードです。

private Camera.Size getBestPreviewSize(List<Camera.Size> previewSizes, int width, int height) {
                double targetAspect = (double)width / (double)height;

        ArrayList<Camera.Size> matchedPreviewSizes = new ArrayList<Camera.Size>();
        final double ASPECT_TOLERANCE = 0.1;
        for(Size previewSize : previewSizes) {
                double previewAspect = (double)previewSize.width / (double)previewSize.height;

                // Original broken code.
                //if(Math.abs(targetAspect - previewAspect) < ASPECT_TOLERANCE) {
                //        matchedPreviewSizes.add(previewSize);
                //}

                // Working code.
                if(Math.abs(targetAspect - previewAspect) < ASPECT_TOLERANCE &&
                            previewSize.width <= width && previewSize.height <= height) {
                        matchedPreviewSizes.add(previewSize);
                }
        }

        Camera.Size bestPreviewSize;
        if(!matchedPreviewSizes.isEmpty()) {
                bestPreviewSize = Collections.max(matchedPreviewSizes, sizeComparator);
        } else {
                bestPreviewSize = Collections.max(previewSizes, sizeComparator);
        }

        return bestPreviewSize;
}

private Comparator<Camera.Size> sizeComparator = new Comparator<Camera.Size>() {

    @Override
    public int compare(Size lhs, Size rhs) {
        long lhsArea = lhs.height*lhs.width;
        long rhsArea = rhs.height*rhs.width;

        if(lhsArea > rhsArea) {
            return 1;
        } else if(lhsArea < rhsArea) {
            return -1;
        } else {
            return 0;
        }
    }

};

上記のコードでは、元の壊れたコードと、関数がデバイスの最大画面サイズを尊重する原因となった作業コードを示しています。これを行うと、さまざまなデバイスで発生していたクラッシュが修正されました。

お役に立てば幸いです。

于 2013-04-20T22:34:55.930 に答える