6

android.hardware.Cameraクラスに基づいてカスタム カメラを作成しました。「写真を撮る」ボタンを押すと、期待される動作は、写真を撮り、まだ取り込まれた写真をレビュー画面に表示することです。しかし、レビュー画面に到達すると、カメラはまだ動作します/ビューファインダーは(静止したレビューではなく)「ライブ」ショットを表示しています。ホルダーが使えないようです。

これは、一部のSamsung Galaxy S3電話機で確認されています ( GT-I9300)。しかし奇妙なことに、他のすべてのモデルではすべて正常に動作します (レビュー画面に静止画像が正常に表示されます)。

4

1 に答える 1

3

これまでの私の解決策は、ビューがサーフェスビューと同じビューを占めるレイアウトを作成することです。

次に、プレビューのビュー境界を取得します(私の場合は画面のサイズです)

//Get our screen size
    Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
            .getDefaultDisplay();
    DisplayMetrics metrics = getResources().getDisplayMetrics();
    Point size = new Point();
    try {
        display.getSize(size);
        w_width = size.x;
        w_height = size.y;
    } catch (NoSuchMethodError e) {
        w_width = display.getWidth();
        w_height = display.getHeight();
    }

次に、コールバックを次のように設定します。

callback = new Camera.PictureCallback() {
            @Override
            public void onPictureTaken(byte[] bytes, Camera camera) {
                //Get the view bounds to determine how to manipulate this image
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = true;
                BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);

                //If the image is smaller than the screen, don't make the image bigger
                int finalWidth = (w_width < options.outWidth) ? w_width : options.outWidth;
                int finalHeight = (w_height < options.outHeight) ? w_height : options.outHeight;
                int inSampleSize = 1;
                options = new BitmapFactory.Options();
                if (finalHeight > w_height || finalWidth > w_width) {

                    // Calculate ratios of height and width to requested height and width
                    final int heightRatio = Math.round((float) finalHeight / (float) w_height);
                    final int widthRatio = Math.round((float) finalWidth / (float) w_width);

                    // Choose the smallest ratio as inSampleSize value, this will guarantee
                    // a final image with both dimensions larger than or equal to the
                    // requested height and width.
                    inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
                }

                options.inSampleSize = inSampleSize;

                //Decode the smaller image
                Bitmap b = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);

                //Rotate the image correctly
                Matrix mat = new Matrix();
                mat.postRotate(orientation);
                Bitmap newBitmap = Bitmap.createBitmap(b, 0, 0, options.outWidth, options.outHeight, mat, true);
                imagePreview.setBackgroundDrawable(new BitmapDrawable(newBitmap));
                imagePreview.setVisibility(View.VISIBLE);
            }
        };

したがって、基本的に、サーフェスビューはプレビューの表示を停止しませんが、イメージビューはプレビューを非表示にして、ユーザーが表示できないようにします。

次に、ユーザーが画像を保持しないことを決定した場合、ビューを再度非表示にすると、surfaceViewはライブプレビューを表示し続けます。幸いなことに、GS3は「camera.startPreview();」を呼び出す人を気にしないようです。プレビューがすでに行われている場合でも。

私はこの答えが本当に好きではありませんが、ギャラクシーS3で動作するのは現時点で私が持っているすべてです。私が試した古いデバイス(2.3以降)で動作しましたが、これは間違いなく回避策にすぎません。

于 2013-02-20T19:20:11.043 に答える