カメラのサーフェスビューを作成しようとしているので、カメラのビューにあるときはいつでもサーフェス上にレンダリングされます。現時点では、カメラビューで見ることができるのは黒い画面ビューだけです。私はグーグルとここを調べようとしましたが、今のところ私が探しているものが見つかりません。誰でも私にいくつかのアイデアを提案することができます。
2 に答える
私はあなたを助けることができるクラスを書きました。
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
. ここでは、カメラ フレームを表示するためのsurfaceView
providessurfaceHolder
とsurfaceHolder
providesを提供します。が作成されると、3 つのコールバック関数が作成されますsurface
。surface
呼ばれた。
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
。
パーミッションを追加したことを確認してください:
<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);
あなたを助けるためにそれがうまくいかない場合は、いくつかのコードを投稿してください