为啥我的相机在另一个活动开始后停止预览?
Posted
技术标签:
【中文标题】为啥我的相机在另一个活动开始后停止预览?【英文标题】:Why My Camera Stop previewing after Another Activity start?为什么我的相机在另一个活动开始后停止预览? 【发布时间】:2011-12-13 03:18:22 【问题描述】:在我的相机应用程序中,我使用以下代码打开图库:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);//
startActivityForResult(Intent.createChooser(intent, "Select Picture"),10);
一切运行良好。但是,当我从画廊返回时,android 相机没有显示其预览。 为什么会发生?我的代码有什么问题?
我的相机活动代码:
public void onCreate(Bundle icicle)
super.onCreate(icicle);
Log.e(TAG, "onCreate");
Bundle extras = getIntent().getExtras();
getWindow().setFormat(PixelFormat.TRANSLUCENT);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);
clickMe = (ImageButton)findViewById(R.id.clickme);
flashBtn = (Button)findViewById(R.id.flashBtn);
selectCamera = (Button)findViewById(R.id.selectCameraFace);
sharePicture = (Button)findViewById(R.id.sharePicture);
selectPicture = (ImageButton)findViewById(R.id.selectPicture);
//mSurfaceView.setOnClickListener(this);
flashBtn.setOnClickListener(this);
selectCamera.setOnClickListener(this);
sharePicture.setOnClickListener(this);
selectPicture.setOnClickListener(this);
clickMe.setOnClickListener(this);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
super.onRestoreInstanceState(savedInstanceState);
Camera.PictureCallback mPictureCallback = new Camera.PictureCallback()
public void onPictureTaken(byte[] imageData, Camera c)
if (imageData != null)
Intent mIntent = new Intent();
StoreByteImage(mContext, imageData, 100, "ImageName");
mCamera.startPreview();
setResult(FOTO_MODE, mIntent);
//finish();
;
protected void onResume()
Log.e(TAG, "onResume");
super.onResume();
if(mPreviewRunning)
mCamera.stopPreview();
protected void onSaveInstanceState(Bundle outState)
super.onSaveInstanceState(outState);
protected void onStop()
Log.e(TAG, "onStop");
super.onStop();
//mCamera.stopPreview();/////// Added Method
public void surfaceCreated(SurfaceHolder holder)
Log.e(TAG, "surfaceCreated");
mCamera = Camera.open();
Camera.Parameters parameters = mCamera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
// parameters.getSupportedColorEffects();
// parameters.setColorEffect(parameters.EFFECT_NEGATIVE);
mCamera.setParameters(parameters);
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
Log.e(TAG, "surfaceChanged");
// XXX stopPreview() will crash if preview is not running
if (mPreviewRunning)
mCamera.stopPreview();
Camera.Parameters p = mCamera.getParameters();
p.setPreviewSize(w, h);
mCamera.setParameters(p);
try
mCamera.setPreviewDisplay(holder);
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
mCamera.startPreview();
mPreviewRunning = true;
public void surfaceDestroyed(SurfaceHolder holder)
Log.e(TAG, "surfaceDestroyed");
mCamera.stopPreview();
mPreviewRunning = false;
mCamera.release();
【问题讨论】:
你是在 onResume()/onActivityResult 方法中再次调用 startPreview() 吗? 是这样的吗??? protected void onResume() Log.e(TAG, "onResume");超级.onResume(); mCamera.startPreview(); 我已经完成了上面的代码,但是出错了。 @MobileCushion :请使用代码检查我的更新问题。让我知道我错在哪里。如果我从相机预览中打开另一个 Activity 并关闭该 Activity,我将无法获得相机预览。 【参考方案1】:您需要在每次活动暂停时释放相机,以便其他人也可以使用相机..并在 onResume 调用中重新获取相机..
这是 onPause 的代码,其中 mCameraDev 是相机对象的句柄
@Override
protected void onPause()
Log.w(TAG, "OnPause()");
if (null != mCameraDev)
mCameraDev.stopPreview();
mCameraDev.release();
mCameraDev = null;
super.onPause();
这是 onResume 的代码
@Override
protected void onResume()
super.onResume();
if (null != mCameraDev)
mCameraDev.startPreview();
mIsPreviewing = true;
else
mCameraDev = android.hardware.Camera.open();
try
mCameraDev.setPreviewDisplay(mSurfaceHolder);
catch (Throwable ex)
throw new RuntimeException("setPreviewDisplay failed", ex);
mIsPreviewing = true;
【讨论】:
以上是关于为啥我的相机在另一个活动开始后停止预览?的主要内容,如果未能解决你的问题,请参考以下文章