11

カメラのサーフェスビューを作成しようとしているので、カメラのビューにあるときはいつでもサーフェス上にレンダリングされます。現時点では、カメラビューで見ることができるのは黒い画面ビューだけです。私はグーグルとここを調べようとしましたが、今のところ私が探しているものが見つかりません。誰でも私にいくつかのアイデアを提案することができます。

4

2 に答える 2

19

私はあなたを助けることができるクラスを書きました。

    public class Preview_can_work extends Activity {
        private SurfaceView surface_view;  
        private Camera mCamera;
        SurfaceHolder.Callback sh_ob = null;
        SurfaceHolder surface_holder        = null;
        SurfaceHolder.Callback sh_callback  = null;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            getWindow().setFormat(PixelFormat.TRANSLUCENT);

            surface_view = new SurfaceView(getApplicationContext());
            addContentView(surface_view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

            if (surface_holder == null) {
                surface_holder = surface_view.getHolder();
            }

            sh_callback = my_callback();
            surface_holder.addCallback(sh_callback);
        }

            SurfaceHolder.Callback my_callback() {      
                SurfaceHolder.Callback ob1 = new SurfaceHolder.Callback() {

                    @Override
                    public void surfaceDestroyed(SurfaceHolder holder) {
                          mCamera.stopPreview();
                          mCamera.release();
                          mCamera = null;
                    }

                    @Override
                    public void surfaceCreated(SurfaceHolder holder) {
                        mCamera = Camera.open();

                          try {
                               mCamera.setPreviewDisplay(holder);  
                          } catch (IOException exception) {  
                                mCamera.release();  
                                mCamera = null;  
                          }
                    }

                    @Override
                    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                            int height) {
                        mCamera.startPreview();
                    }
                };
                return ob1;
        }
    }

マニフェスト ファイルで、カメラの許可のためにこのコードをコピーします

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

説明:

SurfaceView は、SurfaceHolder を含むビューの一種です。SurfaceHolder は、メディア (通常はフレーム) を表示できるサーフェスを保持します。

mCameraカメラ インスタンスを含む Camera オブジェクトです。

デフォルトの Camera インスタンスを保持したい場合は、単に呼び出すことができますCamera.open();

Camera mCamera = Camera.open();

これでカメラが開いているか、デフォルトのカメラ インスタンスが作成されています。次に、カメラからフレームをキャプチャして、サーフェスに表示する必要があります。しかし、あなたはそれなしでそれを表示することはできません

surface. ここでは、カメラ フレームを表示するためのsurfaceViewprovidessurfaceHoldersurfaceHolderprovidesを提供します。が作成されると、3 つのコールバック関数が作成されますsurfacesurface

呼ばれた。

1. public void surfaceCreated(SurfaceHolder holder)
2. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
3. public void surfaceDestroyed(SurfaceHolder holder)

注:- アプリケーションが一時停止すると、Surface は破棄されます。

surfaceCreated: surfaceCreated は、サーフェスが作成されるときに呼び出されるコールバック関数です。これで、カメラを開いて他の属性を設定できます。

surfaceChanged: これは、サーフェスが作成されるときに少なくとも 1 回呼び出されます。その後、サーフェスが変更されるたびに呼び出されます (デバイスの回転)。ここでできること

サーフェスが既に作成されているため、プレビューを開始します。

surfaceDestroyed: これは、サーフェスが破棄されるたびに呼び出されます。サーフェスがない場合は、カメラフレームを表示できる場所にあるので、使用してカメラを解放しました

mCamera.release(). アクティビティが一時停止し、他のアクティビティがカメラを開こうとすると、カメラを開くことができないため、これは非常に重要です。

すでにカメラを開いています。カメラは共有リソースであるため、一度に使用できるアプリケーションは 1 つだけです。カメラを開いた後は、必ずカメラを離してください。

stopPreview: プレビューを開始すると、カメラがフレームのキャプチャを開始し、サーフェスに表示します。サーフェスが破壊された場合は、フレームのキャプチャを停止する必要があります

カメラからなので、電話する必要がありますmCamera.stopPreview

于 2012-05-07T13:22:13.273 に答える
0

パーミッションを追加したことを確認してください:

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

また、これらのウィンドウ プロパティ:

getWindow().setFormat(PixelFormat.TRANSLUCENT);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                 WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

あなたを助けるためにそれがうまくいかない場合は、いくつかのコードを投稿してください

于 2012-05-07T12:34:03.007 に答える