单击按钮开始 recording/stop 录制时,MediaRecorder 总是崩溃
MediaRecorder always crash when click a button to start recording/stop recording
我有一个按钮来控制开始录制和停止 recording.First 当前未录制,开始 recording.If 当前录制,停止录制,然后将文件设置为下一个 activity.But 现在开始录制工作正常,但停止录制时,应用程序崩溃显示以下错误:
java.lang.RuntimeException: stop failed.at
android.media.MediaRecorder.stop(Native Method)
有时点击停止录制时不会崩溃,但是当我返回此视频录制时activity.It再次崩溃,也显示相同的错误。
这是我实现按钮的方式。有关更多信息,我的录音机是 prepare()
in surfaceCreated()
。
boolean isRecording = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
videoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isRecording){
stopRecording();
}else{
startRecording();
}
}
}
private void startRecording() {
Log.d("Video","start recording");
isRecording = true;
mRecorder.start();
}
private void stopRecording() {
Log.d("Video","stop recording");
isRecording = false;
if (null != recorder) {
try{
mRecorder.stop();
mRecorder.reset();
mRecorder.release();
}
catch(RuntimeException ex){
//Ignore
}
}
}
所以我的问题是如何制作一个按钮来正确控制开始和停止录制过程?作为参考,我对使用不感兴趣ToggleButton
,我需要一个普通按钮。
提前致谢。
编辑:
我在 RuntimeExeception
到 mRecorder.start
和 mRecorder.stop
如下所示,但应用程序仍然在第三次单击按钮时崩溃(此时应重新开始录制)。
private void startRecording() {
Log.d("Video","start recording");
isRecording = true;
try {
mRecorder.start();
}catch (RuntimeException e){
e.printStackTrace();
}
}
private void stopRecording() {
Log.d("Video","stop recording");
isRecording = false;
if(mRecorder != null) {
try {
mRecorder.stop();
mRecorder.reset();
mRecorder.release();
}catch (RuntimeException e){
e.printStackTrace();
}
}
}
这是我在应用程序崩溃时得到的堆栈跟踪:
10-19 16:59:03.605 1671-3096/? W/ActivityManager: Spurious death for ProcessRecord{c3a33c7 0:com.ssapp/u0a71}, curProc for 18644: null
10-19 16:59:03.610 1671-1692/? W/WindowManager: Attempted to add application window with unknown token Token{465cf6e ActivityRecord{88a76e9 u0 com.ch.ssapp/.chat.activity.ChatActivity t446 f}}. Aborting.
10-19 16:59:03.610 1671-1692/? W/WindowManager: Token{465cf6e ActivityRecord{88a76e9 u0 /.chat.activity.ChatActivity t446 f}} already running, starting window not displayed. Unable to add window -- token Token{465cf6e ActivityRecord{88a76e9 u0 /.chat.activity.ChatActivity t446 f}} is not valid; is your activity running?
10-19 16:59:03.610 1671-1692/? W/WindowManager: view not successfully added to wm, removing view
10-19 16:59:03.610 1671-1692/? W/WindowManager: Exception when adding starting window
java.lang.IllegalArgumentException: View=com.android.internal.policy.PhoneWindow$DecorView{aab303e V.E...... R.....ID 0,0-0,0} not attached to window manager
at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:424)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:350)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)
at com.android.server.policy.PhoneWindowManager.addStartingWindow(PhoneWindowManager.java:2359)
at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:7840)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
我发现问题是,停止时我没有释放 Camera 和 MediaRecorder recording.So 我在下面解决了这个问题,希望可以帮助其他人:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
videoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isRecording){
stopRecording();
}else{
startRecording();
}
}
}
private void startRecording() {
Log.d("Video","start recording");
mCamera = Camera.open();
if(prepareRecorder()){
mRecorder.start();
isRecording = true;
}else{
if (mRecorder != null) {
// clear recorder configuration
mRecorder.reset();
mRecorder.release();
mRecorder = null;
mCamera.lock();
}
}
}
private void stopRecording() {
Log.d("Video","stop recording");
try{
mRecorder.stop();
}catch (RuntimeException e) {
// RuntimeException is thrown when stop() is called immediately after start().
// In this case the output file is not properly constructed ans should be deleted.
Log.d(TAG, "RuntimeException: stop() is called immediately after start()");
}
if (mRecorder != null) {
// clear recorder configuration
mRecorder.reset();
mRecorder.release();
mRecorder = null;
mCamera.lock();
}
mCamera.lock();
isRecording = false;
releaseCamera();
}
我有一个按钮来控制开始录制和停止 recording.First 当前未录制,开始 recording.If 当前录制,停止录制,然后将文件设置为下一个 activity.But 现在开始录制工作正常,但停止录制时,应用程序崩溃显示以下错误:
java.lang.RuntimeException: stop failed.at android.media.MediaRecorder.stop(Native Method)
有时点击停止录制时不会崩溃,但是当我返回此视频录制时activity.It再次崩溃,也显示相同的错误。
这是我实现按钮的方式。有关更多信息,我的录音机是 prepare()
in surfaceCreated()
。
boolean isRecording = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
videoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isRecording){
stopRecording();
}else{
startRecording();
}
}
}
private void startRecording() {
Log.d("Video","start recording");
isRecording = true;
mRecorder.start();
}
private void stopRecording() {
Log.d("Video","stop recording");
isRecording = false;
if (null != recorder) {
try{
mRecorder.stop();
mRecorder.reset();
mRecorder.release();
}
catch(RuntimeException ex){
//Ignore
}
}
}
所以我的问题是如何制作一个按钮来正确控制开始和停止录制过程?作为参考,我对使用不感兴趣ToggleButton
,我需要一个普通按钮。
提前致谢。
编辑:
我在 RuntimeExeception
到 mRecorder.start
和 mRecorder.stop
如下所示,但应用程序仍然在第三次单击按钮时崩溃(此时应重新开始录制)。
private void startRecording() {
Log.d("Video","start recording");
isRecording = true;
try {
mRecorder.start();
}catch (RuntimeException e){
e.printStackTrace();
}
}
private void stopRecording() {
Log.d("Video","stop recording");
isRecording = false;
if(mRecorder != null) {
try {
mRecorder.stop();
mRecorder.reset();
mRecorder.release();
}catch (RuntimeException e){
e.printStackTrace();
}
}
}
这是我在应用程序崩溃时得到的堆栈跟踪:
10-19 16:59:03.605 1671-3096/? W/ActivityManager: Spurious death for ProcessRecord{c3a33c7 0:com.ssapp/u0a71}, curProc for 18644: null
10-19 16:59:03.610 1671-1692/? W/WindowManager: Attempted to add application window with unknown token Token{465cf6e ActivityRecord{88a76e9 u0 com.ch.ssapp/.chat.activity.ChatActivity t446 f}}. Aborting.
10-19 16:59:03.610 1671-1692/? W/WindowManager: Token{465cf6e ActivityRecord{88a76e9 u0 /.chat.activity.ChatActivity t446 f}} already running, starting window not displayed. Unable to add window -- token Token{465cf6e ActivityRecord{88a76e9 u0 /.chat.activity.ChatActivity t446 f}} is not valid; is your activity running?
10-19 16:59:03.610 1671-1692/? W/WindowManager: view not successfully added to wm, removing view
10-19 16:59:03.610 1671-1692/? W/WindowManager: Exception when adding starting window
java.lang.IllegalArgumentException: View=com.android.internal.policy.PhoneWindow$DecorView{aab303e V.E...... R.....ID 0,0-0,0} not attached to window manager
at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:424)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:350)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)
at com.android.server.policy.PhoneWindowManager.addStartingWindow(PhoneWindowManager.java:2359)
at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:7840)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
我发现问题是,停止时我没有释放 Camera 和 MediaRecorder recording.So 我在下面解决了这个问题,希望可以帮助其他人:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
videoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isRecording){
stopRecording();
}else{
startRecording();
}
}
}
private void startRecording() {
Log.d("Video","start recording");
mCamera = Camera.open();
if(prepareRecorder()){
mRecorder.start();
isRecording = true;
}else{
if (mRecorder != null) {
// clear recorder configuration
mRecorder.reset();
mRecorder.release();
mRecorder = null;
mCamera.lock();
}
}
}
private void stopRecording() {
Log.d("Video","stop recording");
try{
mRecorder.stop();
}catch (RuntimeException e) {
// RuntimeException is thrown when stop() is called immediately after start().
// In this case the output file is not properly constructed ans should be deleted.
Log.d(TAG, "RuntimeException: stop() is called immediately after start()");
}
if (mRecorder != null) {
// clear recorder configuration
mRecorder.reset();
mRecorder.release();
mRecorder = null;
mCamera.lock();
}
mCamera.lock();
isRecording = false;
releaseCamera();
}