为啥我的相机在另一个活动开始后停止预览?

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;
    

【讨论】:

以上是关于为啥我的相机在另一个活动开始后停止预览?的主要内容,如果未能解决你的问题,请参考以下文章

如何在完成后重新打开活动并在其中再次启动相机预览

Android:通过片段进行相机预览。从活动中确定

相机预览没有重新启动?

即使我将应用程序清单设置为纵向,为啥我的 Android 相机预览仍显示横向?

为啥我的 android 活动被停止?

在 android 中设置显示方向后,相机相机预览不正确