2014-02-19 2 views
1

Я создаю пользовательский видеомагнитофон и замечаю, что если телефон переходит в режим сна или блокировки во время работы камеры .. после пробуждения предварительный просмотр камеры застрял на неподвижном неподвижном образ. если я пойду туда и обратно между действиями, камера будет в порядке после возвращения .. эта ошибка, по-видимому, только тогда, когда телефон заснет и просыпается.Камера замерзает на телефоне сон/бодрствование

мое видео регистратор активности

public class DRPVideoCaptureActivity extends Activity { 

    private Camera myCamera; 
    private DRPCameraSurfaceView myCameraSurfaceView; 
    private MediaRecorder mediaRecorder; 

    SurfaceHolder surfaceHolder; 
    boolean recording = false; 

    Globals g = new Globals(); 
    ImageButton btn_record; 
    FrameLayout _videoView; 

    ImageView btn_flashToggle; 
    ImageView btn_cameraToggle; 
    ImageView btn_close; 

    public enum FlashState { 
     off, on, auto 
    } 

    FlashState _flashState = FlashState.off; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.video_camera); 

     _videoView = (FrameLayout) findViewById(R.id.video_frame); 
     btn_record = (ImageButton) findViewById(R.id.btn_record); 
     btn_flashToggle = (ImageView) findViewById(R.id.btn_flash_toggle); 
     btn_cameraToggle = (ImageView) findViewById(R.id.btn_camera_toggle); 
     btn_close = (ImageView) findViewById(R.id.btn_close); 
     recording = false; 


     // myButton = (Button)findViewById(R.id.mybutton); 

    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     // Get Camera for preview 
     _videoView.setVisibility(View.INVISIBLE); 
     myCamera = getCameraInstance(); 
     if (myCamera == null) { 
      Toast.makeText(DRPVideoCaptureActivity.this, "Fail to get Camera", 
        Toast.LENGTH_LONG).show(); 
     }else{ 

      myCameraSurfaceView = new DRPCameraSurfaceView(this, myCamera); 
      _videoView.addView(myCameraSurfaceView); 
     } 

     _videoView.setVisibility(View.VISIBLE); 

    } 

    Button.OnClickListener recordListener = new Button.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      if (recording) { 
       // stop recording and release camera 
       mediaRecorder.stop(); // stop the recording 
       releaseMediaRecorder(); // release the MediaRecorder object 

       // Exit after saved 
       finish(); 
      } else { 

       // Release Camera before MediaRecorder start 
       releaseCamera(); 

       if (!prepareMediaRecorder()) { 
        Toast.makeText(DRPVideoCaptureActivity.this, 
          "Fail in prepareMediaRecorder()!\n - Ended -", 
          Toast.LENGTH_LONG).show(); 
        finish(); 
       } 

       mediaRecorder.start(); 
       recording = true; 
       // myButton.setText("STOP"); 
      } 
     } 
    }; 

    private Camera getCameraInstance() { 
     // TODO Auto-generated method stub 
     Camera c = null; 
     try { 

      c = Camera.open(); // attempt to get a Camera instance 
      c.setDisplayOrientation(90); 
     } catch (Exception e) { 
      Log.v("cam","EXCEPTION: "+e);// Camera is not available (in use or does not exist) 
     } 
     return c; // returns null if camera is unavailable 
    } 

    private boolean prepareMediaRecorder() { 
     myCamera = getCameraInstance(); 
     mediaRecorder = new MediaRecorder(); 

     myCamera.unlock(); 
     mediaRecorder.setCamera(myCamera); 

     mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

     mediaRecorder.setProfile(CamcorderProfile 
       .get(CamcorderProfile.QUALITY_HIGH)); 

     mediaRecorder.setOutputFile(g.kExtStorageDirectory + g.kVideoDirectory 
       + "myvideo.mp4"); 
     mediaRecorder.setMaxDuration(60000); // Set max duration 60 sec. 
     mediaRecorder.setMaxFileSize(5000000); // Set max file size 5M 

     mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder() 
       .getSurface()); 

     try { 
      mediaRecorder.prepare(); 
     } catch (IllegalStateException e) { 
      releaseMediaRecorder(); 
      return false; 
     } catch (IOException e) { 
      releaseMediaRecorder(); 
      return false; 
     } 
     return true; 

    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     releaseMediaRecorder(); // if you are using MediaRecorder, release it 
           // first 
     releaseCamera(); // release the camera immediately on pause event 

    } 

    private void releaseMediaRecorder() { 
     if (mediaRecorder != null) { 
      mediaRecorder.reset(); // clear recorder configuration 
      mediaRecorder.release(); // release the recorder object 
      mediaRecorder = null; 
      myCamera.lock(); // lock camera for later use 
     } 
    } 

    private void releaseCamera() { 
     if (myCamera != null) { 
      myCamera.stopPreview(); 

      myCamera.release(); // release the camera for other applications 
      myCamera = null; 
     } 
    } 

} 

мой вид поверхности камеры

public class DRPCameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{ 

    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public DRPCameraSurfaceView(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int weight, 
      int height) { 
     // If your preview can change or rotate, take care of those events here. 
     // Make sure to stop the preview before resizing or reformatting it. 

     if (mHolder.getSurface() == null){ 
      // preview surface does not exist 
      return; 
     } 

     // stop preview before making changes 
     try { 
      mCamera.stopPreview(); 
     } catch (Exception e){ 
      // ignore: tried to stop a non-existent preview 
     } 

     // make any resize, rotate or reformatting changes here 

     // start preview with new settings 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 

     } catch (Exception e){ 
     } 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 

     // The Surface has been created, now tell the camera where to draw the preview. 
     try { 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     this.getHolder().removeCallback(this); 
     //mCamera.stopPreview(); 
     // mCamera.release(); 
     // mCamera = null; 
     Log.v("surfaceDestroyed", "surfaceDestroyed"); 


    } 
} 

ответ

0

хорошо вы пытаетесь построить приложение, которое может записывать от фона для этого вы должны принять помощь службы в android и еще один пример, если ваша камера в настоящее время работает в фоновом режиме из вашего приложения и другое приложение при попытке доступа к камере, но это займет ваше приложение, то это будет причиной аварии, что приложение для ваших советов быть осторожным

см по этой ссылке для записи видео с фоном: Link 1

+0

его не врезаться .. предварительный просмотр камеры просто по-прежнему – erik

+0

им просто дает вам совет manh, что если вы не освободите камеру от вашего приложения, тогда другое приложение, которое хочет использовать камеру, выйдет из строя .. просто для вашего друга-друга .. – NILL

+0

и для вашего решения вам необходимо прикрепить видео записывая код в сервисе, чтобы он работал в фоновом режиме. для получения дополнительной информации об обслуживании в android найти здесь. http://developer.android.com/reference/android/app/Service.html – NILL

Смежные вопросы