我正在尝试为相机创建一个表面视图,以便在相机视图中呈现在表面上。目前我在相机视图中看到的只是一个黑屏视图。我试图在谷歌和这里看,但到目前为止,我还没有找到我想要的东西。任何人都可以建议我一些想法。
答案 0 :(得分: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的View。 SurfaceHolder保存我们可以在其上显示媒体的表面(通常是帧)。
mCamera
是一个Camera对象,它将包含相机实例。
如果您想要保留默认的Camera实例,则只需拨打Camera.open();
Camera mCamera = Camera.open();
现在您有一个开放式摄像头或者您正在使用默认摄像头实例。现在,您需要从相机捕获帧并将其显示在曲面上。但是没有任何
你就无法显示它 surface
。 surfaceView
提供surfaceHolder
,surfaceHolder
提供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
:
这将在您的曲面创建时至少调用一次。之后,只要表面发生变化,就会调用它(在设备旋转中)。你可以在这里
开始预览,因为您的表面已经创建。
surfaceDestroyed
:
每次表面破坏时都会调用它。现在,如果你没有表面,那么你可以在哪里显示相机帧,所以我已经使用
mCamera.release()
。这非常重要,因为如果您的活动暂停并且任何其他活动试图打开相机,那么它将无法打开它
已打开相机。 Camera是共享资源,因此有一次只有一个应用程序可以使用它。所以每当你打开相机时都要记住一件事,然后一直释放它。
stopPreview
:
当您开始预览时,相机会开始捕捉您的相框并将其显示在曲面上。现在,如果你的表面已经破坏,那么你需要停止捕捉帧
来自相机,因此您必须致电mCamera.stopPreview
。
答案 1 :(得分:0)
让shure你添加了许可:
<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);
发布一些代码,如果这不起作用以帮助您