7

पर क्रैश हो गया है मैंने कई विषयों की खोज की है लेकिन कोई सीधा जवाब नहीं है।MediaRecorder प्रारंभ

मैं इस कोड है:

 recorder = new MediaRecorder(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 

    recorder.setOutputFile(mFileName); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    if(!mStartRecording) 
    { 
     btn.setText("Stop Recording"); 
     try { 
      recorder.prepare(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     recorder.start(); 
     mStartRecording = true; 
    } 
    else 
    { 
     btn.setText("Start Recording"); 
     mStartRecording = false; 
     recorder.stop(); 
     recorder.reset(); 
     recorder.release(); 

     recorder = null; 
    } 

और मैं जोड़ दिया है:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.STORAGE" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

(कहीं देखा कि जोड़ने भंडारण इसे हल, अच्छा नहीं मेरे लिए)

मैं एपीआई लेवल 7 (एंड्रॉइड 2.1) पर विकास

स्टैक ट्रेस कहता है "विफल होना शुरू करें" स्टैक ट्रेस: ​​

04-26 19:27:41.955: D/dalvikvm(890): GC freed 809 objects/58272 bytes in 433ms 
04-26 19:27:44.772: D/dalvikvm(890): GC freed 95 objects/3936 bytes in 371ms 
04-26 19:28:54.973: E/MediaRecorder(890): start failed: -1 
04-26 19:28:54.993: D/AndroidRuntime(890): Shutting down VM 
04-26 19:28:54.993: W/dalvikvm(890): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
04-26 19:28:54.993: E/AndroidRuntime(890): Uncaught handler: thread main exiting due to uncaught exception 
04-26 19:28:55.105: E/AndroidRuntime(890): java.lang.IllegalStateException: Could not execute method of the activity 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.View$1.onClick(View.java:2031) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.View.performClick(View.java:2364) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.View.onTouchEvent(View.java:4179) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.widget.TextView.onTouchEvent(TextView.java:6541) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.View.dispatchTouchEvent(View.java:3709) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
04-26 19:28:55.105: E/AndroidRuntime(890): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
04-26 19:28:55.105: E/AndroidRuntime(890): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
04-26 19:28:55.105: E/AndroidRuntime(890): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.os.Looper.loop(Looper.java:123) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.app.ActivityThread.main(ActivityThread.java:4363) 
04-26 19:28:55.105: E/AndroidRuntime(890): at java.lang.reflect.Method.invokeNative(Native Method) 
04-26 19:28:55.105: E/AndroidRuntime(890): at java.lang.reflect.Method.invoke(Method.java:521) 
04-26 19:28:55.105: E/AndroidRuntime(890): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
04-26 19:28:55.105: E/AndroidRuntime(890): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-26 19:28:55.105: E/AndroidRuntime(890): at dalvik.system.NativeStart.main(Native Method) 
04-26 19:28:55.105: E/AndroidRuntime(890): Caused by: java.lang.reflect.InvocationTargetException 
04-26 19:28:55.105: E/AndroidRuntime(890): at shibby.whisper.WhisperGameActivity.recordAudio(WhisperGameActivity.java:94) 
04-26 19:28:55.105: E/AndroidRuntime(890): at java.lang.reflect.Method.invokeNative(Native Method) 
04-26 19:28:55.105: E/AndroidRuntime(890): at java.lang.reflect.Method.invoke(Method.java:521) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.View$1.onClick(View.java:2026) 
04-26 19:28:55.105: E/AndroidRuntime(890): ... 21 more 
04-26 19:28:55.105: E/AndroidRuntime(890): Caused by: java.lang.RuntimeException: start failed. 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.media.MediaRecorder.start(Native Method) 
04-26 19:28:55.105: E/AndroidRuntime(890): ... 25 more 
04-26 19:28:55.223: I/dalvikvm(890): threadid=7: reacting to signal 3 
04-26 19:28:55.335: I/dalvikvm(890): Wrote stack trace to '/data/anr/traces.txt' 
04-26 19:28:57.123: I/Process(890): Sending signal. PID: 890 SIG: 9 

कृपया मदद करें।

+0

सभी स्टैक ट्रेस प्रदान करें कृपया – Snicolas

+0

@ सिनिकोल प्रदान किए गए। –

+0

आप /data/anr/traces.txt – Snicolas

उत्तर

3

ठीक है, मैं समझ गया। मुझे लगता है कि आपने mStartRecording को सच में प्रारंभ किया है।

इस प्रकार आपके ifelse ब्लॉक में जा रहा है। इसमें, आप MediaRecorder का एक नया नया उदाहरण रोकते हैं और राज्य आरेख इसकी अनुमति नहीं देता है।

अपने मीडिया रिकॉर्डर को अपनी कक्षा का एक क्षेत्र बनाएं। और अपने mStartRecording बूलियन चर को ठीक से शुरू करें। यदि आपका क्षेत्र शून्य है तो केवल अपने मीडिया रिकॉर्डर को पुन: स्थापित करें।

if(recorder == null) { 
    recorder = new MediaRecorder(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 

    recorder.setOutputFile(mFileName); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
}//if 
if(!mStartRecording) { 
    btn.setText("Stop Recording"); 
    try { 
     recorder.prepare(); 
     recorder.start(); 
     mStartRecording = true; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }//catch 
} else { 
    btn.setText("Start Recording"); 
    mStartRecording = false; 
    recorder.stop(); 
    recorder.reset(); 
    recorder.release(); 
    recorder = null; 
}//else 
+0

क्षमा करें मैंने उल्लेख नहीं किया, मैंने सोचा कि यह एक दिया गया है। mStartRecording गलत है। –

+0

इसे आजमाएं। यह अभी भी एक बेहतर तरीका है जिसे इसे – Snicolas

+1

कोड किया गया है, मैंने अभी भी एक ही त्रुटि की कोशिश की है। –

2

prepare फ़ंक्शन के समान ब्लॉक में start फ़ंक्शन डालने का प्रयास करें। हो सकता है कि निष्पादन से तैयार अपवाद अवरोधन हो और सीधे IllegalStateException उत्पन्न करने के लिए सीधे चला जाए।

recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(output_formats[currentFormat]); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    recorder.setOutputFile(getFilename()); 


    try { 
     recorder.prepare(); 
     recorder.start(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

यह शुरुआत में ऐसा था, अभी भी काम नहीं कर रहा है। –

+0

सटीक एक ही निशान ... –

+0

setaudioencoder के बाद आपका setoutputfile है? इसे बदलने की कोशिश करो! –

0

कोशिश अपने रिकॉर्डर शुरू करने के लिए केवल जब यह तैयार किया जाता है:

try { 
     recorder.prepare(); 
     recorder.start(); 
     mStartRecording = true; 
    } catch (IOException e) { 
     Log.e(LOG_TAG, "Error when preparing or starting recorder", e); 
    } 
+0

मैंने ऐसा किया। अभी भी काम नहीं कर रहा है ... –

1

मैं निम्नलिखित कोड का उपयोग कर रहा, मेरे लिए पूरी तरह से काम करता है ..

protected void startRecording() { 
    // TODO Auto-generated method stub 
    i++; 
    mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    mFileName += "/audiorecordtest"+i+".3gp"; 
    recorder = new MediaRecorder(); 

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    recorder.setOutputFile(mFileName); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

     try { 
     recorder.prepare(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     Toast.makeText(getApplicationContext(), "IllegalStateException called", Toast.LENGTH_LONG).show(); 


    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     Toast.makeText(getApplicationContext(), "prepare() failed", Toast.LENGTH_LONG).show(); 

    } 

     recorder.start(); 
} 

private void stopRecording() { 
    recorder.stop(); 
    recorder.release(); 
    recorder = null; 
    } 
0

इन विधियों है ताकि इसे चलेंगे की व्यवस्था करना चाहिए। यहां:

recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
recorder.setOutputFile(mFileName); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
0

मुझे एक ही समस्या थी। ऐसा इसलिए है क्योंकि रिकॉर्ड किए गए ऑडियो के लिए फ़ाइल नाम सेट करते समय मुझे स्लैश याद आया था।

परिवर्तन

this.fileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
this.fileName += "yourfilename.3gp"; 

this.fileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
this.fileName += "/yourfilename.3gp"; 
0

को मैं अपने SurfaceView की वजह से एक ही समस्या थी अदृश्य किया गया है। तो इसे दृश्यमान बनाएं

mSurfaceView.setVisibility(View.VISIBLE); 
संबंधित मुद्दे