2016-02-19 6 views
2

У меня есть активность в Android, которая отображает предварительный просмотр в реальном времени с использованием поверхности. Все работает отлично, однако, когда я нажимаю кнопку блокировки на своем телефоне, а затем разблокирую свой телефон или когда диалоговое окно из другого действия (например, передача Bluetooth или входящий вызов) накладывает мой предварительный просмотр камеры, приложение отключается. Я подозреваю, что это проблема с моими действиями onResume() или onPause(), так как я получаю сообщение об ошибке «метод после release()». Однако я не уверен, как это исправить.Android App Сбой при приостановке

CAMERA АКТИВНОСТЬ:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_camera_screen); 
    setStatusBarColor(); 
    Display display = getWindowManager().getDefaultDisplay(); 
    final int height = display.getHeight(); 

    session = new SessionManager(getApplicationContext()); 
    try { 
     mCamera = Camera.open();//you can use open(int) to use different cameras 
    } catch (Exception e) { 
     Log.d("ERROR", "Failed to get camera: " + e.getMessage()); 
    } 


    if (mCamera != null) { 
     mCameraView = new CameraPreview(this, mCamera);//create a SurfaceView to show camera data 
     FrameLayout camera_view = (FrameLayout) findViewById(R.id.camera_view); 
     camera_view.addView(mCameraView);//add the SurfaceView to the layout 
     //rotate preview 
     mCamera.setDisplayOrientation(90); 
    //rotate camera 
     Camera.Parameters p = mCamera.getParameters(); 
     p.setRotation(90); 
     mCamera.setParameters(p); 
    } 
    @Override 
protected void onPause() { 
    super.onPause(); 
    if (mCamera != null) { 
     mCamera.setPreviewCallback(null); 
     mCameraView.getHolder().removeCallback(mCameraView); 
     mCamera.release(); 
    } 
} 
@Override 
public void onResume() { 
    super.onResume(); 

    // Get the Camera instance as the activity achieves full user focus 
    if (mCamera == null) { 
     initializeCamera(); // Local method to handle camera initialization 
    } 
} 



protected void initializeCamera(){ 
    // Get an instance of Camera Object 
    try{ 
     mCamera = Camera.open();//you can use open(int) to use different cameras 
    } catch (Exception e){ 
     Log.d("ERROR", "Failed to get camera: " + e.getMessage()); 
    } 


    if(mCamera != null) { 
     mCameraView = new CameraPreview(this, mCamera);//create a SurfaceView to show camera data 
     FrameLayout camera_view = (FrameLayout)findViewById(R.id.camera_view); 
     camera_view.addView(mCameraView);//add the SurfaceView to the layout 
    } 

}

+1

'mCamera.release()' не будет делать 'mCamera 'null. Назначьте 'null'' mCamera' после выпуска. – Abdullah

+0

Опубликовать свой логарифм – Wesley

ответ

1

Попробуйте добавить эту строку в OnPause():

camera_view.removeView(mCameraView); 
0
onPause(){ 
... 
mCamera.release(); // close mCamera, but not set it to null 
//mCamera = null; // you need reset mCamera to trigger init method; 
} 
onResume(){ 
... 
initializeCamera();// need mCamera == null 
} 

//If you find other problems. 
//Add some codes in the initializeCamera(). 
{ 
//mCamera.setPreviewCallback("something"); 
//mCameraView.getHolder().addCallback(mCameraView); 
} 
//as onPause do.