2017-10-18 7 views
0

이전 활동으로 돌아가는 방법을 알고 있습니다. 현재 활동 (VideoActivity.java)에 MediaRecorder에 비디오를 기록하려면 SurfaceView이 있습니다. 내가 이전 활동으로 돌아갑니다 finish()을 구현할 때마다 아래 로그 캣 같은 오류의 원인 :SurfaceView를 사용하는 현재 활동이있을 때 이전 활동으로 돌아 오는 방법?

E/BufferQueueProducer: [SurfaceView] dequeueBuffer: BufferQueue has been abandoned 
E/EmulatedCamera_Preview: onNextFrameAvailable: Unable to dequeue preview window buffer: 19 -> No such device 

로그 캣은 그러므로 난 그냥이이 선을 보여, 매우 긴 목록을 위의 2 라인을 반복하게된다.

위 logcat 외에, VideoActivity.java을 입력 할 때마다 응용 프로그램이 중지됩니다. 이 코드는 잘 작동

public class VideoActivity extends AppCompatActivity implements SurfaceHolder.Callback{ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_video); 

    surfaceHolder = videoSurface.getHolder(); 
    surfaceHolder.addCallback(this); 
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    backButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      if(isRecording){ 
       stopRecording(); 
       finish(); 
      }else{ 
       finish(); 
      } 

     } 
    }); 
} 


@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    try{ 
     mCamera = Camera.open(); 
    }catch (RuntimeException ex){ 
     ex.printStackTrace(); 
    } 

    try{ 
     mCamera.setPreviewDisplay(surfaceHolder); 
     mCamera.startPreview(); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 
    prepareRecorder(); 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    mRecorder.reset(); 
    mRecorder.release(); 
    mCamera.release(); 

    // once the objects have been released they can't be reused 
    mRecorder = null; 
    mCamera = null; } 

} 

내가 이전 활동으로 돌아 전에 :이 내가

backButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if(isRecording){ 
        stopRecording(); 
        finish(); 
       }else{ 
        finish(); 
       } 

     } 
    }); 

기본적으로 나는이 같은 서피스 뷰 SurfaceView를 구현하는 이전 작업으로 돌아 구현하는 방법이다

finish()을 사용하십시오.

내 질문에 액서스가 SurfaceView 인 경우 어떻게 이전 활동으로 돌아갈 수 있습니까? 나에게 올바른 방법을 보여주십시오.

답변

0

은 내가 릴리스에 의해 CameramediaRecorder을이 문제를 해결하기 CameraMediaRecorder .I 수 finish() 전에 해제 didnt가 실현, 그래서 코드는이

back.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(isRecording){ 
        Log.d("Video","stop recording"); 
      try{ 
        mRecorder.stop(); 
      }catch (RuntimeException e) { 

      } 
      releaseMediaRecorder(); 
      mCamera.lock(); 
      isRecording = false; 
      releaseCamera(); 
        finish(); 
       }else{ 
        releaseCamera(); 
        finish(); 
       } 

      } 
     }); 
} 

private void releaseCamera(){ 
     if (mCamera != null){ 
      // release the camera for other applications 
      mCamera.setPreviewCallback(null); 
      surfaceHolder.removeCallback(VideoActivity.this); 
      mCamera.release(); 
      mCamera = null; 
     } 
} 

private void releaseMediaRecorder(){ 
     if (mRecorder != null) { 
      // clear recorder configuration 
      mRecorder.reset(); 

      mRecorder.release(); 
      mRecorder = null; 

      mCamera.lock(); 
     } 
} 
과 같이됩니다