2016-08-01 3 views
11

내 코드 중 일부가 호출되지 않는이 이상한 버그가 있습니다. 그러나 호출되지 않는 이유는 없습니다.Android MediaRecorder stop()이 호출되지 않음

onFinishedRecording이 호출되고 태그 "Finished recording."이 로그 아웃되지만 그 이후의 코드는 전혀 호출되지 않습니다. mMediaRecorder.stop();이 호출되면 모든 코드가 호출을 멈 춥니 다. 또한 catch 블록에도 들어 가지 않습니다. 왜 이런 일이 일어나는 걸까요?

다른 스레드와 관련이 있다고 생각했지만 모든 스레드 이름을 검사했으며 모두 동일한 주 스레드에서 실행되고 있습니다.

내 카메라 미리보기 설정에 문제가있을 수 있습니까? 비디오를 다시 재생하려고하면 비디오가 손상되어 재생할 수 없습니다.

위의 문제 외에 내 뒤로 단추는 응용 프로그램에서 아무 것도하지 않습니다. 왜 또는 구현 한 코드와 관련이 있는지 표시하지 않습니다.

에 MyLibrary 클래스 (라이브러리 모듈 클래스) 그래서 모든 것이이 방법이 호출 될 때까지 잘 작동

public class RecordActivity extends AppCompatActivity implements 
     CameraInitListener { 

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

    @Override 
    protected void onResume() { 
     super.onResume(); 
     MyLibrary.getInstance().initialize(this); 
    } 

    @Override 
    protected void onPause() { 
     MyLibrary.getInstance().release(); 
     super.onPause(); 
    } 

    @Override 
    public void onCameraInitialized() { 
     MyLibrary.getInstance().startRecording(); 
    } 
} 

public class MyLibrary implements PreciseCountdownTimer.PreciseCountdownTimerCallback { 

    private static final String TAG = AngryOtter.class.getSimpleName(); 
    private static final long MAX_RECORD_TIME_MILLIS = 3000; 
    private static final long INTERVAL_MILLIS = 1000; 

    private static MyLibrary mInstance; 

    private Activity mActivity; 
    private CameraInitListener mCallback; 

    private int mCameraId = -1; 
    private Camera mCamera; 
    private SurfaceView mCameraPreview; 
    private MediaRecorder mMediaRecorder; 
    private PreciseCountdownTimer mTimer; 
    private File mTempVideoFile; 

    public static MyLibrary getInstance() { 
     if (mInstance == null) { 
      mInstance = new MyLibrary(); 
     } 
     return mInstance; 
    } 

    // Call this in onResume of the activity 
    public void initialize(Activity activity) { 
     mActivity = activity; 

     try { 
      mCallback = (CameraInitListener) mActivity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.getClass().getSimpleName() 
        + " must implement CameraInitListener"); 
     } 

     if (ViewUtil.checkValidRootView(mActivity)) { 
      PermissionUtil.requestPermissions(mActivity); 
      prepareCamera(); 
      if (mCamera == null) { 
       return; 
      } 
      addCameraPreview(); 
     } 
    } 

    // Call this in onPause of the activity 
    public void release() { 
     releaseMediaRecorder(); 
     releaseCamera(); 
     removeCameraPreview(); 
     releaseTimer(); 
    } 

    public void startRecording() { 
     if (checkPermissions()) { 
      try { 
       mMediaRecorder.start(); 
       mTimer.start(); 
       Log.d(TAG, "Recording started."); 
      } catch (IllegalStateException e) { 
       releaseMediaRecorder(); 
       releaseTimer(); 
      } 
     } else { 
      releaseMediaRecorder(); 
     } 
    } 

    public void stopRecording() { 
     onFinishedRecording(); 
    } 

    @Override 
    public void onPreciseTimerTick(long remainingTime) { 
     Log.d(TAG, "TICK: " + String.valueOf(remainingTime)); 
    } 

    @Override 
    public void onPreciseTimerFinished() { 
     Log.d(TAG, "Timer Finished."); 
     mActivity.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       onFinishedRecording(); 
      } 
     }); 
    } 

    private boolean checkPermissions() { 
     if (PermissionUtil.checkCameraPermission(mActivity) 
       && PermissionUtil.checkRecordAudioPermission(mActivity) 
       && PermissionUtil.checkWriteExternalStoragePermission(mActivity)) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    private void prepareCamera() { 
     mCameraId = CameraUtil.getFrontCameraId(); 
     if (mCameraId != -1) { 
      try { 
       Log.d(TAG, "Initializing front camera."); 
       mCamera = Camera.open(mCameraId); 
      } catch (Exception e) { 
       Log.e(TAG, "Error initializing front camera: " + e.getMessage()); 
       mCamera = null; 
      } 
     } else { 
      mCamera = null; 
     } 
    } 

    private void releaseCamera() { 
     if (mCamera != null){ 
      Log.d(TAG, "Releasing camera."); 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    private void addCameraPreview() { 
     mCameraPreview = new SurfaceView(mActivity); 
     mCameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() { 
      @Override 
      public void surfaceCreated(SurfaceHolder holder) { 
       Log.d(TAG, "Preview surface created."); 
       try { 
        Log.d(TAG, "Setting preview display."); 
        mCamera.setPreviewDisplay(holder); 
        mCamera.startPreview(); 
        onPreviewDisplaySet(); 
       } catch (IOException e) { 
        Log.e(TAG, "Error setting camera preview: " + e.getMessage()); 
       } 
      } 

      @Override 
      public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
       Log.d(TAG, "Preview surface changed."); 
       // 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 (mCameraPreview.getHolder().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 
       } 

       // Adjust orientation 
       final int rotation = CameraUtil.getAdjustedDisplayOrientation(mActivity, mCameraId); 
       mCamera.setDisplayOrientation(rotation); 

       // set preview size and make any resize, rotate or 
       // reformatting changes here 

       // start preview with new settings 
       try { 
        mCamera.setPreviewDisplay(mCameraPreview.getHolder()); 
        mCamera.startPreview(); 
       } catch (Exception e){ 
        Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 
       } 
      } 

      @Override 
      public void surfaceDestroyed(SurfaceHolder holder) { 
       Log.d(TAG, "Preview surface destroyed."); 
      } 
     }); 
     mCameraPreview.setLayoutParams(new FrameLayout.LayoutParams(100, 100, Gravity.TOP|Gravity.RIGHT)); 
     mCameraPreview.setBackgroundColor(ContextCompat.getColor(mActivity, android.R.color.holo_red_dark)); 

     final WindowManager windowManager = 
       (WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE); 
     final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(1, 1, 
       WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 0, PixelFormat.UNKNOWN); 
     windowManager.addView(mCameraPreview, layoutParams); 
    } 

    private void removeCameraPreview() { 
     if (mCameraPreview != null) { 
      final ViewGroup rootView = ViewUtil.getRootView(mActivity); 
      rootView.removeView(mCameraPreview); 
     } 
    } 

    private void onPreviewDisplaySet() { 
     createTempVideoFile(); 

     prepareMediaRecorder(); 
     if (mMediaRecorder == null) { 
      return; 
     } 

     prepareTimer(); 
     mCallback.onCameraInitialized(); 
    } 

    private void createTempVideoFile() { 
     mTempVideoFile = FileUtil.getTempVideoFile(mActivity); 
    } 

    private void prepareMediaRecorder() { 
     if (mCamera != null) { 
      mCamera.unlock(); 
     } 

     mMediaRecorder = new MediaRecorder(); 
     mMediaRecorder.setCamera(mCamera); 
     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mMediaRecorder.setProfile(CamcorderProfile.get(mCameraId, CamcorderProfile.QUALITY_HIGH)); 
     mMediaRecorder.setOutputFile(mTempVideoFile.getAbsolutePath()); 
     mMediaRecorder.setPreviewDisplay(mCameraPreview.getHolder().getSurface()); 
//  mMediaRecorder.setOrientationHint(90); 

     try { 
      Log.d(TAG, "Preparing media recorder."); 
      mMediaRecorder.prepare(); 
     } catch (IllegalStateException|IOException e) { 
      Log.e(TAG, "Error preparing MediaRecorder: " + e.getMessage()); 
      releaseMediaRecorder(); 
     } 
    } 

    private void releaseMediaRecorder() { 
     if (mMediaRecorder != null) { 
      Log.d(TAG, "Releasing media recorder."); 
      mMediaRecorder.reset(); 
      mMediaRecorder.release(); 
      mMediaRecorder = null; 
     } 

     if (mCamera != null) { 
      mCamera.lock(); 
     } 
    } 

    private void prepareTimer() { 
     mTimer = new PreciseCountdownTimer(MAX_RECORD_TIME_MILLIS, INTERVAL_MILLIS, this); 
    } 

    private void releaseTimer() { 
     if (mTimer != null) { 
      Log.d(TAG, "Stopping timer."); 
      mTimer.stop(); 
     } 
    } 

    private void onFinishedRecording() { 
     Log.d(TAG, "Finished recording."); 
     try { 
      mMediaRecorder.stop(); 
      Log.d(TAG, "Media recorder stopped."); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     releaseMediaRecorder(); 
     releaseTimer(); 
     getSignedUrl(); 
    } 

    private void getSignedUrl() { 
     new GcpSigningRequest(new NetworkCallback<String>() { 
      @Override 
      public void onSuccess(String response) { 
       uploadVideo(response); 
      } 

      @Override 
      public void onError() { 
       Log.e(TAG, "Error getting signing request."); 
      } 
     }).addToQueue(); 
    } 

    private void uploadVideo(String signedUrl) { 
     new UploadToGoogleRequest(signedUrl, mTempVideoFile.getName(), 
       Uri.parse(mTempVideoFile.getAbsolutePath()), new NetworkCallback<Boolean>() { 
      @Override 
      public void onSuccess(Boolean response) { 

      } 

      @Override 
      public void onError() { 

      } 
     }).addToQueue(); 
    } 
} 

RecordActivity :

private void onFinishedRecording() { 
     Log.d(TAG, "Finished recording."); 
     try { 
      mMediaRecorder.stop(); 
      Log.d(TAG, "Media recorder stopped."); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } 

     releaseMediaRecorder(); 
     releaseTimer(); 
     getSignedUrl(); 
    } 
0 123,414,전체 전화 스택 트레이스

08-15 21:17:46.735 24660-24660/com.walintukai.heatmapdemo I/dalvikvm: Could not find method android.content.res.Resources.getDrawable, referenced from method android.support.v7.widget.ResourcesWrapper.getDrawable 
08-15 21:17:46.735 24660-24660/com.walintukai.heatmapdemo W/dalvikvm: VFY: unable to resolve virtual method 690: Landroid/content/res/Resources;.getDrawable (ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable; 
08-15 21:17:46.735 24660-24660/com.walintukai.heatmapdemo D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002 
08-15 21:17:46.735 24660-24660/com.walintukai.heatmapdemo I/dalvikvm: Could not find method android.content.res.Resources.getDrawableForDensity, referenced from method android.support.v7.widget.ResourcesWrapper.getDrawableForDensity 
08-15 21:17:46.735 24660-24660/com.walintukai.heatmapdemo W/dalvikvm: VFY: unable to resolve virtual method 692: Landroid/content/res/Resources;.getDrawableForDensity (IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable; 
08-15 21:17:46.735 24660-24660/com.walintukai.heatmapdemo D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002 
08-15 21:17:46.785 933-11266/? D/KeyguardUpdateMonitor: sendKeyguardVisibilityChanged(true) 
08-15 21:17:46.785 933-933/? D/KeyguardUpdateMonitor: handleKeyguardVisibilityChanged(1) 
08-15 21:17:46.785 731-2931/? E/EnterpriseContainerManager: ContainerPolicy Service is not yet ready!!! 
08-15 21:17:46.785 731-2931/? D/EnterpriseDeviceManager: ContainerId: 0 
08-15 21:17:46.785 731-2931/? W/LicenseLogService: log() failed 
08-15 21:17:46.805 170-170/? E/SMD: DCD ON 
08-15 21:17:46.865 933-11213/? D/KeyguardUpdateMonitor: sendKeyguardVisibilityChanged(true) 
08-15 21:17:46.865 933-933/? D/KeyguardUpdateMonitor: handleKeyguardVisibilityChanged(1) 
08-15 21:17:46.935 380-24718/? E/mm-camera: color_correct_apply_gain: cc_gain_adj 1.000, digital_gain_brightness 1.000 dig_gain = 1.000 
08-15 21:17:47.055 731-24783/? W/ContextImpl: Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1509 com.android.server.InputMethodManagerService$4.run:2683 java.lang.Thread.run:841 <bottom of call stack> <bottom of call stack> 
08-15 21:17:47.145 174-234/? E/qdmemalloc: heap_msk=3000000 flags=1 

08-15 21:17:47.165 174-234/? E/qdmemalloc: heap_msk=40000000 flags=1 

08-15 21:17:47.185 933-10839/? D/KeyguardUpdateMonitor: sendKeyguardVisibilityChanged(true) 
08-15 21:17:47.185 933-933/? D/KeyguardUpdateMonitor: handleKeyguardVisibilityChanged(1) 
08-15 21:17:47.225 933-947/? D/KeyguardUpdateMonitor: sendKeyguardVisibilityChanged(true) 
08-15 21:17:47.245 933-933/? D/KeyguardUpdateMonitor: handleKeyguardVisibilityChanged(1) 
08-15 21:17:47.265 933-10842/? D/KeyguardUpdateMonitor: sendKeyguardVisibilityChanged(true) 
08-15 21:17:47.275 174-940/? E/qdmemalloc: heap_msk=3000000 flags=1 

08-15 21:17:47.275 174-940/? E/qdmemalloc: heap_msk=40000000 flags=1 

08-15 21:17:47.285 24660-24660/com.walintukai.heatmapdemo D/RecordingService: Tick: 2000 
08-15 21:17:47.295 933-933/? D/KeyguardUpdateMonitor: handleKeyguardVisibilityChanged(1) 
08-15 21:17:47.305 179-24742/? W/CameraSource: Timed out waiting for incoming camera video frames: 0 us 
08-15 21:17:47.375 933-11213/? D/KeyguardUpdateMonitor: sendKeyguardVisibilityChanged(true) 
08-15 21:17:47.375 933-933/? D/KeyguardUpdateMonitor: handleKeyguardVisibilityChanged(1) 
08-15 21:17:47.506 933-953/? D/KeyguardUpdateMonitor: sendKeyguardVisibilityChanged(true) 
08-15 21:17:47.506 933-933/? D/KeyguardUpdateMonitor: handleKeyguardVisibilityChanged(1) 
08-15 21:17:47.666 731-838/? D/PackageManager: [MSG] CHECK_PENDING_VERIFICATION 
08-15 21:17:47.766 179-460/? D/AudioStreamOutALSA: standby 
08-15 21:17:47.766 179-460/? D/ALSAModule: s_standby: handle 0xb7c24650 h 0x0 
08-15 21:17:47.766 179-460/? E/ALSAModule: s_standby handle h 0xb7ceb678 
08-15 21:17:47.836 933-6432/? D/KeyguardUpdateMonitor: sendKeyguardVisibilityChanged(true) 
08-15 21:17:47.846 933-933/? D/KeyguardUpdateMonitor: handleKeyguardVisibilityChanged(1) 
08-15 21:17:47.846 174-234/? I/SurfaceFlinger: id=833 Removed ieatmapdemo (12/17) 
08-15 21:17:47.846 174-940/? I/SurfaceFlinger: id=833 Removed ieatmapdemo (-2/17) 
08-15 21:17:47.896 933-11464/? D/KeyguardUpdateMonitor: sendKeyguardVisibilityChanged(true) 
08-15 21:17:47.906 933-933/? D/KeyguardUpdateMonitor: handleKeyguardVisibilityChanged(1) 
08-15 21:17:47.956 179-460/? D/ALSAModule: checkRunningHandle return false 
08-15 21:17:47.956 179-460/? D/alsa_ucm: snd_use_case_set(): uc_mgr 0xb7bf62a0 identifier _verb value Inactive 
08-15 21:17:47.956 179-460/? D/alsa_ucm: Set mixer controls for HiFi enable 0 
08-15 21:17:47.956 179-460/? D/alsa_ucm: Setting mixer control: PRI_RX Audio Mixer MultiMedia1, value: 0 
08-15 21:17:47.956 179-460/? E/ALSAModule: Number of modifiers 1 
08-15 21:17:47.956 179-460/? E/ALSAModule: index 0 modifier Capture Music 
08-15 21:17:47.956 179-460/? E/ALSAModule: use case is Capture Music 
08-15 21:17:47.956 179-460/? E/ALSAModule: usecase_type is 2 
08-15 21:17:47.956 179-460/? D/alsa_ucm: snd_use_case_set(): uc_mgr 0xb7bf62a0 identifier _disdev value Speaker 
08-15 21:17:47.956 179-460/? D/alsa_ucm: Set mixer controls for Speaker enable 0 
08-15 21:17:47.956 179-460/? D/alsa_ucm: Setting mixer control: RX5 MIX1 INP1, value: ZERO 
08-15 21:17:47.966 179-460/? D/alsa_ucm: Setting mixer control: RX5 MIX1 INP2, value: ZERO 
08-15 21:17:47.966 179-460/? D/alsa_ucm: Setting mixer control: LINEOUT2 Volume, value: 0 
08-15 21:17:47.966 179-460/? D/alsa_ucm: Setting mixer control: LINEOUT4 Volume, value: 0 
08-15 21:17:47.966 179-460/? D/alsa_ucm: Setting mixer control: RX5 Digital Volume, value: 0 
08-15 21:17:48.286 24660-24660/com.walintukai.heatmapdemo D/RecordingService: Tick: 1000 
08-15 21:17:48.296 731-824/? D/SensorService: 0.2 -0.0 11.0 
08-15 21:17:48.647 731-824/? E/Sensors: accelHandler 0.162861 -0.044308 11.044633 
08-15 21:17:48.727 179-24722/? E/mm-camera: poll type 1 returns 0 
08-15 21:17:48.727 179-24723/? E/mm-camera: poll type 1 returns 0 
08-15 21:17:48.727 179-24721/? E/mm-camera: poll type 1 returns 0 
08-15 21:17:49.297 24660-24660/com.walintukai.heatmapdemo D/RecordingService: Tick: 0 
08-15 21:17:49.297 24660-24660/com.walintukai.heatmapdemo D/RecordingService: Timer Finished 
08-15 21:17:49.297 24660-24660/com.walintukai.heatmapdemo D/RecordingService: Finished recording 
08-15 21:17:49.297 179-20689/? D/MPEG4Writer: Stopping Video track 
08-15 21:17:49.808 170-170/? E/SMD: DCD ON 
08-15 21:17:50.309 179-24742/? W/CameraSource: Timed out waiting for incoming camera video frames: 0 us 
08-15 21:17:51.440 179-24720/? E/mm-camera: poll type 1 returns 0 
08-15 21:17:51.570 179-24724/? E/mm-camera: poll type 0 returns 0 
08-15 21:17:51.800 731-824/? D/SensorService: 0.2 -0.0 11.1 
08-15 21:17:52.111 731-856/? V/AlarmManager: waitForAlarm result :4 
08-15 21:17:52.121 731-856/? V/AlarmManager: trigger ELAPSED_REALTIME_WAKEUP or RTC_WAKEUP 
08-15 21:17:52.151 731-824/? E/Sensors: accelHandler 0.129331 -0.021555 11.078163 
08-15 21:17:52.151 19505-24874/? I/Finsky: [3562] com.google.android.finsky.receivers.FlushLogsReceiver$FlushLogsService.onHandleIntent(163): Flushing event logs for [wwRg65ZPhINg_7-olzSHzcWExtM] 
08-15 21:17:52.161 19505-19520/? I/PlayCommon: [3510] com.google.android.play.a.al.e(730): Preparing logs for uploading 
08-15 21:17:52.161 19505-20595/? I/PlayCommon: [3552] com.google.android.play.a.w.a(27553): Starting to flush logs 
08-15 21:17:52.161 19505-20595/? I/PlayCommon: [3552] com.google.android.play.a.w.a(27564): Log flushed by 0 successful uploads 
08-15 21:17:52.201 1184-1184/? I/Auth: [AuthDelegateWrapper] Service intent: Intent { cmp=com.google.android.gms/.auth.account.authenticator.DefaultAuthDelegateService }. 
08-15 21:17:52.201 1184-1184/? I/Auth: [AuthDelegateWrapper] Service intent: Intent { cmp=com.google.android.gms/.auth.account.authenticator.DefaultAuthDelegateService }. 
08-15 21:17:52.261 19505-19520/? I/PlayCommon: [3510] com.google.android.play.a.al.a(870): Connecting to server: https://play.googleapis.com/play/log?format=raw&proto_v2=true 
08-15 21:17:52.441 731-826/? W/ProcessCpuTracker: Skipping unknown process pid 24877 
08-15 21:17:52.451 731-826/? W/ProcessCpuTracker: Skipping unknown process pid 24879 
08-15 21:17:52.451 731-826/? W/ProcessCpuTracker: Skipping unknown process pid 24880 
+0

캐치에 RuntimeException을 추가하고 releaseMediaRecorder()를 이동하십시오. 마지막으로 차단하는 등. 작동하는 경우 왜 작동하는지 설명 할 답변을 작성합니다. –

+0

'Log.d (TAG, "Finished recording.");는 (는) _ 뒤에 _nothing_가 발생합니까? 이에 대한 더 많은 정보 : logcat은 try/catch의'e.printStackTrace();'에 대해 무엇을 말하고'! = null'을 체크하고 있음을 확인하고 로그에 넣으면'== null'? – TWL

+0

@NikoYuwono'RuntimeException'을 추가했지만 catch 블록이 실행되지 않습니다. 나는 또한'releaseMediaRecorder()'를 finally 블록으로 옮겼습니다. –

답변

2

글쎄, 난 이미 일부 네이티브 코드가 충돌 것이며 는 어느 쪽도 자바 코드에 반환하지 아무 말도하지 않고 현재 스레드을 파괴 상황의 비슷한 종류를 만났다.

하지만 메인 스레드가 아니기 때문에 나머지 앱은 정상적으로 작동하는 것으로 보입니다.

아마도 안드로이드 장치 모니터는 실행중인 스레드에 대해 중요한 점을 보여줍니다.

호핑이 유용했습니다.

+0

ok 나중에 테스트 해 보겠습니다. 그런 일이 일어날 수있는 것처럼 들립니다. 어떤 메소드가 실행되기 전에 어느 쓰레드가 로그 아웃되었지만, 그들은 모두 메인 쓰레드에있는 것으로 보였다. –

+0

[so]에 오신 것을 환영합니다! 귀하의 기여가 가치있는 일일 수 있지만, 이것은 답변이 아니라 주석입니다. 50 명의 담당자가있는 모든 곳에서 의견을 말할 수 있으며, 거의 다 왔을 것입니다. 지금 당장 대답 할 수있는 질문에 충실하십시오. – jpaugh

3

코드 실행이 얼마나 멀리 추적되는지 (겉으로보기에) 잃어버린 곳을 감안할 때, 코드에 다음과 같은 수정 사항을 제안합니다. 그러면 코드가 어떻게 진행되고 있는지 더 잘 알 수 있습니다. 블랙홀에 들어가기 전의 전체 스택 트레이스를 보는 것은 흥미로울 것입니다.

private void onFinishedRecording() { 
    Log.d(TAG, "Going into the black hole."); 
    try { 
     Log.d(TAG, "So far so good, but if you don't see this just pull your hair ..."); 
     mMediaRecorder.stop(); 
     Log.d(TAG, "Media recorder stopped."); 
    } catch (Error e) { 
     Log.d(TAG, "So there was an error ..."); 
     e.printStackTrace(); 
     Log.d(TAG, "Did you get what that error was?"); 
    } catch (Exception e) { 
     Log.d(TAG, "So there was some kind of an exception."); 
     e.printStackTrace(); 
     Log.d(TAG, "Did you get what the exception was?"); 
    } finally { 
     Log.d(TAG, "Leaving the black hole."); 
    } 
    Log.d(TAG, "So I did get out of the black hole after all ..."); 
    releaseMediaRecorder(); 
    releaseTimer(); 
    getSignedUrl(); 
} 

행운을 빈다.

업데이트 :

원시 로그 캣 항목을 (앱을 제한하지 않음)을 포함하시기 바랍니다. 네이티브 코드의 일부 오류로 인해 앱과 관련되지 않은 오류가 발생할 수 있지만 실제로는 오류가 발생할 수 있습니다. 또한 미리보기 크기는 선택한 비디오 크기와 같아야합니다. 자세한 내용은 this post을 참조하십시오.

는 업데이트 2 :.

08-15 21:17:49.297 24660-24660/com.walintukai.heatmapdemo D/RecordingService: Finished recording 
08-15 21:17:49.297 179-20689/? D/MPEG4Writer: Stopping Video track 
08-15 21:17:49.808 170-170/? E/SMD: DCD ON 
08-15 21:17:50.309 179-24742/? W/CameraSource: Timed out waiting for incoming camera video frames: 0 us 
:

미안 해요,하지만 멀리 왔고에서 그냥 빨리 눈에 다이빙을 할 기회가 없었어요, 나는 카메라 시간 제한에 대한 참조를 발견

내가 말할 수있는 바로는 stop()을 실행 한 직후에 비디오를 중지하려는 시도가 있지만 에 멈추고 에 도달하지 못하고에 도달하지 않은 다음 CameraSource가 몇 줄 늦게 종료됩니다. 준비를 마친 후 및 녹음을 시작한 후에 어떤 일이 일어나는지 보려면 몇 가지 로그 항목을 추가 할 수 있습니다. 거기에 몇 가지 단서가있을 수 있습니다. 어떻게 든 stop() 호출은 무한정 카메라 (교착 상태)와 같은 무언가를 기다리고있는 것처럼 보입니다. 이것은 오류의 징후와 일치하지만, 그 후에는 아무 일도 일어나지 않을 것입니다. 중단 점을 바로 놓고 다양한 리소스 (카메라)의 상태를 확인하고 잠긴 상태인지 또는 stop()을 기다리는 상태인지 확인하십시오. 마지막으로 미리보기에서 지원되는 크기/해상도를 사용하고 있는지 확인하고 녹화 크기 및 해상도와 호환되는지 확인합니다. 잠재적 인 문제/불일치는 내부적으로 교착 상태의 원인 일 수 있습니다 (즉, 실행하기에서 정지를 방해하는 어떤 또는.)

+0

그래서 모든 로그를 추가했습니다. 결과는 다음과 같습니다. '08-14 18 : 35 : 57.788 14089-14089/com.walintukai.heatmapdemo D/RecordingService : 블랙홀로 들어갑니다. 08-14 18 : 35 : 57.788 14089-14089/com.walintukai.heatmapdemo D/RecordingService : 지금까지는 그렇게 좋았지 만, 이것을 보지 못했다면 머리를 당길 수 있습니다 ... ' –

+0

거의 같은 결과 전에. MediaRecorder를 멈추려 할 때 코드가 멈 춥니 다. –

+0

마지막 행 다음에 몇 가지 logcat 항목을 추가 할 수 있습니까? 비록 앱과 관련이없는 것 같으면 /? – Kaamel

1

나는 당신이 당신이 그것에 stop()를 호출하기 전에 mediaRecorder 그 시점에서하지 null 있는지 확인한다고 생각합니다.

+0

이 시점에서 확실히 null이 아닙니다. 하나는'Exception e' catch 블록에'NullPointerException'을 던질 것이고, 아무것도 던지지 않을 것이다. 게다가, 나는 디버깅을했고'MediaRecorder'는이 시점에서 null이 아닙니다. –

관련 문제