簡體   English   中英

getCameraInstance(0)返回null

[英]getCameraInstance(0) returns null

基本思想是,如果未檢測到面部,應返回Main(重置活動),但返回main之后,getCameraInstance(0)返回null。

如果我想返回Main,它將調用onPause()並釋放凸輪,並且在Main重新創建后,backCamera已經重載,應該無問題地創建一個新的back camera實例。我錯了嗎?

謝謝

ps:我得到java.lang.RuntimeException:無法連接到攝像頭服務,這意味着我沒有正確釋放攝像頭,但是我找不到我的錯誤。 這是我的代碼

public class MainActivity extends Activity{
....
private Camera mCameraBack=null;
private CameraPreviewBack mPreviewBack;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    if(mCameraBack==null){
            mCameraBack=getCameraInstance(0);
        }

        try{

            mPreviewBack=new CameraPreviewBack(this,mCameraBack );
            previewBack=(FrameLayout)findViewById(R.id.camera_preview_back);
            previewBack.addView(mPreviewBack);
        }catch(Exception ex){
            Log.d(TAG,"surfaceCreate");
            ex.printStackTrace();
        }

public void capture(View view){

mPreviewBack.takePicture();
...
}

@Override
    protected void onPause() {
        Log.d(TAG, "onPause");
        super.onPause();

        if (mCameraBack != null) {
            mCameraBack.stopPreview();
            mCameraBack.release();
            mCameraBack = null;
        }

        if (mPreviewBack != null) {
            previewBack.removeView(mPreviewBack);
            mPreviewBack = null;
        }

    }

    @Override
    public void onResume() {
        Log.d(TAG, "onResume");
        super.onResume();
        if (mCameraBack == null) {
            mCameraBack = getCameraInstance(0);
        }

        if (mPreviewBack == null) {
            mPreviewBack=new CameraPreviewBack(this,mCameraBack );
            previewBack.addView(mPreviewBack);

        }
    }

public static Camera getCameraInstance(int cameraId){

        Camera c = null;
        try {
            c = Camera.open(cameraId); 
        }
        catch (Exception e){
        }
        return c; // returns null if camera is unavailable
    }
}

public class CameraPreviewBack extends SurfaceView implements SurfaceHolder.Callback {
...

public CameraPreviewBack(Context context,Camera camera) {
        super(context);
        mCamera=camera;
        this.context=context;
        mHolder=getHolder();
        mHolder.addCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Log.d(TAG, "Surface created");

        try {
            if(mCamera!=null){
                mCamera.setPreviewDisplay(holder);
                mCamera.startPreview();
            }
        } catch (IOException e) {
            Log.d(TAG, "mHolder failure");
            e.printStackTrace();
        }

    }

@Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        Log.d(TAG, "Surface changed");
        configureCamRotation();
    }


    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }

public void takePicture(){
         ..
        task.execute();
        try {
            task.get();
        } catch (InterruptedException e) {

        } catch (ExecutionException e) {
        }
    task.cancel(isFinished);
}

private PictureCallback getPictureCallback() {
        PictureCallback mPicture = new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera){
            ....
            if(!detected){
             Intent intentMain=new Intent(context, MainActivity.class);
             intentMain.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
             context.startActivity(intentMain);
            }
...


}
   private class TakePictureTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            mCamera.takePicture(null, null, getPictureCallback());
            try {
                Thread.sleep(2000); // 3 second preview
            } catch (InterruptedException e) {
            }
            return null;
        } 
}

像下面這樣的新的吞咽異常:

捕獲(異常e){}

打印此異常Log.d(TAG,“初始化照相機時出錯”,e); 也許您會得到:

釋放相機onDestroy並更改Asynctask的onPostExecute方法中的Intent解決了我的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM