安卓相机preVIEW黑屏 [英] android camera preview blank screen
本文介绍了安卓相机preVIEW黑屏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想利用现有的应用程序摄像头捕捉到的照片手工不行。所以我做了这个的活动
公共类CameraActivity延伸活动{ 私人相机mCamera;
私人preVIEW米preVIEW; @覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_camera);
//创建相机的一个实例
mCamera = Camera.open(0);如果(mCamera!= NULL)Log.i(CameraActivity.onCreate(),mCamera初始化); //创建我们的preVIEW查看和设置它作为我们活动的内容。
米preVIEW =新的preVIEW(本);如果(M!preVIEW = NULL)Log.i(CameraActivity.onCreate(),M preVIEW初始化); 的FrameLayout preVIEW =(的FrameLayout)findViewById(R.id.camera_ preVIEW); preview.addView(M preVIEW); Log.i(CameraActivity.onCreate(),M preVIEW加入的FrameLayout); 米preview.setCamera(mCamera); Log.i(CameraActivity.onCreate(),M preview.setCamera(mCamera)); } @覆盖
公共布尔onCreateOptionsMenu(菜单菜单){
//充气菜单;如果是present这增加了项目操作栏。
。getMenuInflater()膨胀(R.menu.activity_camera,菜单);
返回true;
} @覆盖
公共无效的onPause(){
super.onPause();
米preview.stop previewAndFreeCamera();
}}
这是相机preVIEW,我想用:
公共类preVIEW扩展的ViewGroup实现SurfaceHolder.Callback { SurfaceView mSurfaceView;
SurfaceHolder mHolder; 私人相机mCamera;
清单<尺寸和GT; mSupported previewSizes; / **
* @参数方面
* /
公共preVIEW(上下文的背景下){
超级(上下文); mSurfaceView =新SurfaceView(背景); Log.i(摄像机preview.constructor(...),mSurfaceView初始化);
如果(mSurfaceView == NULL){Log.i(摄像机preview.constructor(......),mSurfaceView为空);}
addView(mSurfaceView); //安装SurfaceHolder.Callback所以我们得到通知时,
//创建下垫面和销毁。
mHolder = mSurfaceView.getHolder(); Log.i(摄像机preview.constructor(......),mHolder设置);
如果(mHolder == NULL){Log.e(previewCamera,mHolder为空);} mHolder.addCallback(本);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
} / **
* @参数方面
* @参数ATTRS
* /
公共preVIEW(上下文的背景下,ATTRS的AttributeSet){
超(背景下,ATTRS);
// TODO自动生成构造函数存根
} / **
* @参数方面
* @参数ATTRS
* @参数defStyle
* /
公共preVIEW(上下文的背景下,ATTRS的AttributeSet,诠释defStyle){
超(背景下,ATTRS,defStyle);
// TODO自动生成构造函数存根
} / *(非Javadoc中)
* @see android.view.ViewGroup#onLayout(布尔,INT,INT,INT,INT)
* /
@覆盖
保护无效onLayout(布尔为arg0,ARG1 INT,INT ARG2,诠释ARG3,诠释ARG4){
// TODO自动生成方法存根 } @覆盖
公共无效surfaceChanged(SurfaceHolder架,INT格式,宽度INT,
INT高度){
//现在,尺寸是已知的,设置相机参数,并开始
//将preVIEW。
Camera.Parameters参数= mCamera.getParameters();
parameters.set previewSize(宽度,高度);
requestLayout();
mCamera.setParameters(参数); / *
重要提示:通话开始preVIEW()开始更新preVIEW表面。 preVIEW必须
开始前,你可以拍照。
* /
mCamera.start preVIEW(); Log.i(摄像机preview.surfaceChanged(......),mCamera.start preVIEW()); } @覆盖
公共无效surfaceCreated(SurfaceHolder持有人){
// TODO自动生成方法存根 } @覆盖
公共无效surfaceDestroyed(SurfaceHolder持有人){
//当我们回到地面就会被破坏,因此停止preVIEW。
如果(mCamera!= NULL){
/ *
通话停止preVIEW()停止更新preVIEW表面。
* /
mCamera.stop preVIEW(); Log.i(摄像机preview.surfaceDestroyed(......),mCamera.stop preVIEW());
} } / **
*当这个函数返回,mCamera将为空。
* /
公共无效停止previewAndFreeCamera(){ 如果(mCamera!= NULL){
/ *
通话停止preVIEW()停止更新preVIEW表面。
* /
mCamera.stop preVIEW(); Log.i(摄像机preview.stop previewAndFreeCamera(),mCamera.stop preVIEW()); / *
重要提示:呼叫释放()来释放相机其他应用程序使用。
应用程序应该立即释放相机的onPause()(并重新打开()它
onResume())。
* /
mCamera.release(); Log.i(摄像机preview.stop previewAndFreeCamera(),mCamera.release()); mCamera = NULL;
}
}
/ ***
*
* @参数摄像头
* /
公共无效setCamera(相机摄像机){
如果(mCamera ==摄像头){Log.i(摄像机preview.setCamera(),mCamera等于你要设置的相机);返回; } 停止previewAndFreeCamera(); Log.i(摄像机preview.setCamera(),停止previewAndFreeCamera()); mCamera =摄像头; Log.i(摄像机preview.setCamera(),设置新的相机); 如果(mCamera!= NULL){
清单<尺寸和GT; localSizes = mCamera.getParameters()getSupported previewSizes()。
mSupported previewSizes = localSizes;
requestLayout(); 尝试{
mCamera.set previewDisplay(mHolder);
Log.i(摄像机preview.setCamera(),mCamera.set previewDisplay(mHolder));
}赶上(IOException异常五){
e.printStackTrace();
} / *
重要提示:通话开始preVIEW()开始更新preVIEW表面。 preVIEW绝
开始之前,你可以拍照。
* /
mCamera.start preVIEW(); Log.i(摄像机preview.setCamera(),mCamera.start preVIEW());
}
}
/ ***
*
* @参数ID
* @返回
* /
公共布尔safeCameraOpen(INT ID){
布尔QOPENED = FALSE; 尝试{
releaseCameraAnd preVIEW();
mCamera = Camera.open(ID); QOPENED =(!mCamera = NULL);
}赶上(例外五){
// Log.e(R.string.app_name,无法打开相机);
e.printStackTrace();
} 返回QOPENED;
} / **
*
* /
Camera.PictureCallback mPicCallback =新Camera.PictureCallback(){ @覆盖
公共无效onPictureTaken(字节[]数据,相机摄像头){
// TODO自动生成方法存根
Log.d(拉拉,PIC是采取);
}
}; / **
*
* /
公共无效takePic(){ // mCamera.takePicture(NULL,mPicCallback,mPicCallback); }
/ **
*
* /
私人无效releaseCameraAnd preVIEW(){
this.setCamera(NULL);
如果(mCamera!= NULL){
mCamera.release();
mCamera = NULL;
}
}}
这是CameraActivity的布局:
< LinearLayout中的xmlns:机器人=http://schemas.android.com/apk/res/android
的xmlns:工具=http://schemas.android.com/tools
机器人:layout_width =match_parent
机器人:layout_height =match_parent
工具:上下文=CameraActivity。>
<的FrameLayout
机器人:ID =@ + ID / camera_ preVIEW
机器人:layout_width =0dip
机器人:layout_height =FILL_PARENT
机器人:layout_weight =1
/> <按钮
机器人:ID =@ + ID / button_capture
机器人:文字=捕捉
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:layout_gravity =中心
/>
< / LinearLayout中>
但是,当我开始CameraActivity,我只是看到一个空白的白色背景和拍摄键式?为什么我没有看到相机屏幕?
编辑:logcat的:
13 12-16:09:39.941:I / CameraActivity.onCreate()(439):mCamera初始化
12-16 13:09:39.941:I /摄像机preview.constructor(...)(439):mSurfaceView初始化
12-16 13:09:39.941:I /摄像机preview.constructor(...)(439):mHolder设置
12-16 13:09:39.941:I / CameraActivity.onCreate()(439):M preVIEW初始化
12-16 13:09:39.952:I / CameraActivity.onCreate()(439):M preVIEW加入的FrameLayout
12-16 13:09:39.952:I /摄像机preview.setCamera()(439):停止previewAndFreeCamera()
12-16 13:09:39.952:I /摄像机preview.setCamera()(439):安装新的摄像头
12-16 13:09:39.961:D /摄像机(439):应用程序传递NULL面
12-16 13:09:39.961:I /摄像机preview.setCamera()(439):mCamera.set previewDisplay(mHolder)
12-16 13:09:39.971:I /摄像机preview.setCamera()(439):mCamera.start preVIEW()
12-16 13:09:39.971:I / CameraActivity.onCreate()(439):M preview.setCamera(mCamera)
12-16 13:09:40.622:I / ActivityManager(60):显示com.example.popup / .CameraActivity:+ 810ms
解决方案
我想以后 addView你应该叫
。结果的open()
()方法
相机preVIEW大小是由设置addView()
。
I want to capture a photo manually not by using existing camera apps. So i made this Activity:
public class CameraActivity extends Activity {
private Camera mCamera;
private Preview mPreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
// Create an instance of Camera
mCamera = Camera.open(0); if(mCamera !=null) Log.i("CameraActivity.onCreate()", "mCamera initialized");
// Create our Preview view and set it as the content of our activity.
mPreview = new Preview(this); if(mPreview !=null) Log.i("CameraActivity.onCreate()", "mPreview initialized");
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mPreview); Log.i("CameraActivity.onCreate()", "mPreview added to FrameLayout");
mPreview.setCamera(mCamera); Log.i("CameraActivity.onCreate()", "mPreview.setCamera(mCamera)");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_camera, menu);
return true;
}
@Override
public void onPause() {
super.onPause();
mPreview.stopPreviewAndFreeCamera();
}
}
This is the CameraPreview which i want to use:
public class Preview extends ViewGroup implements SurfaceHolder.Callback {
SurfaceView mSurfaceView;
SurfaceHolder mHolder;
private Camera mCamera;
List<Size> mSupportedPreviewSizes;
/**
* @param context
*/
public Preview(Context context) {
super(context);
mSurfaceView = new SurfaceView(context); Log.i("CameraPreview.constructor(...)", "mSurfaceView initialized");
if(mSurfaceView==null) {Log.i("CameraPreview.constructor(...)", "mSurfaceView is null");}
addView(mSurfaceView);
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = mSurfaceView.getHolder(); Log.i("CameraPreview.constructor(...)", "mHolder setup");
if(mHolder==null) {Log.e("PreviewCamera", "mHolder is null");}
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
/**
* @param context
* @param attrs
*/
public Preview(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
/**
* @param context
* @param attrs
* @param defStyle
*/
public Preview(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see android.view.ViewGroup#onLayout(boolean, int, int, int, int)
*/
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
// TODO Auto-generated method stub
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);
requestLayout();
mCamera.setParameters(parameters);
/*
Important: Call startPreview() to start updating the preview surface. Preview must be
started before you can take a picture.
*/
mCamera.startPreview(); Log.i("CameraPreview.surfaceChanged(...)", "mCamera.startPreview()");
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// Surface will be destroyed when we return, so stop the preview.
if (mCamera != null) {
/*
Call stopPreview() to stop updating the preview surface.
*/
mCamera.stopPreview(); Log.i("CameraPreview.surfaceDestroyed(...)", "mCamera.stopPreview()");
}
}
/**
* When this function returns, mCamera will be null.
*/
public void stopPreviewAndFreeCamera() {
if (mCamera != null) {
/*
Call stopPreview() to stop updating the preview surface.
*/
mCamera.stopPreview(); Log.i("CameraPreview.stopPreviewAndFreeCamera()", "mCamera.stopPreview()");
/*
Important: Call release() to release the camera for use by other applications.
Applications should release the camera immediately in onPause() (and re-open() it in
onResume()).
*/
mCamera.release(); Log.i("CameraPreview.stopPreviewAndFreeCamera()", "mCamera.release()");
mCamera = null;
}
}
/***
*
* @param camera
*/
public void setCamera(Camera camera) {
if (mCamera == camera) { Log.i("CameraPreview.setCamera()", "mCamera equals the Camera you want to set"); return; }
stopPreviewAndFreeCamera(); Log.i("CameraPreview.setCamera()", "stopPreviewAndFreeCamera()");
mCamera = camera; Log.i("CameraPreview.setCamera()", "setup new Camera");
if (mCamera != null) {
List<Size> localSizes = mCamera.getParameters().getSupportedPreviewSizes();
mSupportedPreviewSizes = localSizes;
requestLayout();
try {
mCamera.setPreviewDisplay(mHolder);
Log.i("CameraPreview.setCamera()", "mCamera.setPreviewDisplay(mHolder)");
} catch (IOException e) {
e.printStackTrace();
}
/*
Important: Call startPreview() to start updating the preview surface. Preview must
be started before you can take a picture.
*/
mCamera.startPreview(); Log.i("CameraPreview.setCamera()", "mCamera.startPreview()");
}
}
/***
*
* @param id
* @return
*/
public boolean safeCameraOpen(int id) {
boolean qOpened = false;
try {
releaseCameraAndPreview();
mCamera = Camera.open(id);
qOpened = (mCamera != null);
} catch (Exception e) {
// Log.e(R.string.app_name, "failed to open Camera");
e.printStackTrace();
}
return qOpened;
}
/**
*
*/
Camera.PictureCallback mPicCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
Log.d("lala", "pic is taken");
}
};
/**
*
*/
public void takePic() {
// mCamera.takePicture(null, mPicCallback, mPicCallback);
}
/**
*
*/
private void releaseCameraAndPreview() {
this.setCamera(null);
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
}
This is the Layout of CameraActivity:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".CameraActivity" >
<FrameLayout
android:id="@+id/camera_preview"
android:layout_width="0dip"
android:layout_height="fill_parent"
android:layout_weight="1"
/>
<Button
android:id="@+id/button_capture"
android:text="Capture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
</LinearLayout>
But when i start the CameraActivity, i just see a blank white background and the Capture-Button??? Why i dont see the Camera-Screen?
EDIT: Logcat:
12-16 13:09:39.941: I/CameraActivity.onCreate()(439): mCamera initialized
12-16 13:09:39.941: I/CameraPreview.constructor(...)(439): mSurfaceView initialized
12-16 13:09:39.941: I/CameraPreview.constructor(...)(439): mHolder setup
12-16 13:09:39.941: I/CameraActivity.onCreate()(439): mPreview initialized
12-16 13:09:39.952: I/CameraActivity.onCreate()(439): mPreview added to FrameLayout
12-16 13:09:39.952: I/CameraPreview.setCamera()(439): stopPreviewAndFreeCamera()
12-16 13:09:39.952: I/CameraPreview.setCamera()(439): setup new Camera
12-16 13:09:39.961: D/Camera(439): app passed NULL surface
12-16 13:09:39.961: I/CameraPreview.setCamera()(439): mCamera.setPreviewDisplay(mHolder)
12-16 13:09:39.971: I/CameraPreview.setCamera()(439): mCamera.startPreview()
12-16 13:09:39.971: I/CameraActivity.onCreate()(439): mPreview.setCamera(mCamera)
12-16 13:09:40.622: I/ActivityManager(60): Displayed com.example.popup/.CameraActivity: +810ms
解决方案
I think you should call open()
method after addView()
.
Camera preview size is set by addView()
.
这篇关于安卓相机preVIEW黑屏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文