2012-06-12 119 views
0

我试图通过MediaRecorder录制音频,并且出现错误,我试图改变一切,没有任何工作。最后两个小时,我试图找到错误,我也使用了Log类,并且当它调用recorder.start()方法时,我发现发生了错误。可能是什么问题呢?通过MediaRecorder录制音频

public class AudioRecorderActivity extends Activity { 

MediaRecorder recorder; 
File audioFile = null; 
private static final String TAG = "AudioRecorderActivity"; 
private View startButton; 
private View stopButton; 

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

    startButton = findViewById(R.id.start); 
    stopButton = findViewById(R.id.stop); 

    setContentView(R.layout.main); 
} 

public void startRecording(View view) throws IOException{ 

    startButton.setEnabled(false); 
    stopButton.setEnabled(true); 

    File sampleDir = Environment.getExternalStorageDirectory(); 

    try{ 
     audioFile = File.createTempFile("sound", ".3gp", sampleDir); 
    }catch(IOException e){ 
     Toast.makeText(getApplicationContext(), "SD Card Access Error", Toast.LENGTH_LONG).show(); 
     Log.e(TAG, "Sdcard access error"); 
     return; 
    } 

    recorder = new MediaRecorder(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    recorder.setAudioEncodingBitRate(16); 
    recorder.setAudioSamplingRate(44100); 
    recorder.setOutputFile(audioFile.getAbsolutePath()); 
    recorder.prepare(); 
    recorder.start(); 
} 

public void stopRecording(View view){ 
    startButton.setEnabled(true); 
    stopButton.setEnabled(false); 
    recorder.stop(); 
    recorder.release(); 
    addRecordingToMediaLibrary(); 
} 

protected void addRecordingToMediaLibrary(){ 
    ContentValues values = new ContentValues(4); 
    long current = System.currentTimeMillis(); 
    values.put(MediaStore.Audio.Media.TITLE, "audio" + audioFile.getName()); 
    values.put(MediaStore.Audio.Media.DATE_ADDED, (int)(current/1000)); 
    values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp"); 
    values.put(MediaStore.Audio.Media.DATA, audioFile.getAbsolutePath()); 
    ContentResolver contentResolver = getContentResolver(); 

    Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    Uri newUri = contentResolver.insert(base, values); 

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri)); 
    Toast.makeText(this, "Added File" + newUri, Toast.LENGTH_LONG).show(); 
    } 

} 

这里是xml布局。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/RelativeLayout1" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<Button 
    android:id="@+id/start" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="146dp" 
    android:onClick="startRecording" 
    android:text="Start Recording" /> 

<Button 
    android:id="@+id/stop" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/start" 
    android:layout_below="@+id/start" 
    android:layout_marginTop="41dp" 
    android:enabled="false" 
    android:onClick="stopRecording" 
    android:text="Stop Recording" /> 

</RelativeLayout> 

而且我添加了AndroidManifest文件的权限。

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="in.isuru.audiorecorder" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="8" /> 


<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name=".AudioRecorderActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

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

</manifest> 

这是错误我得到的,

06-11 18:27:44.548: E/AndroidRuntime(765): java.lang.IllegalStateException: Could not execute method of the activity 
06-11 18:27:44.548: E/AndroidRuntime(765):  at android.view.View$1.onClick(View.java:2072) 

我需要录制高质量音频。

谢谢!

+0

你可以发布更多的日志猫错误 – FoamyGuy

回答

1

我没有花时间去寻找错误代码,但是这个代码的工作:

public class ExampleActivity extends Activity implements OnClickListener { 
private Button startButton; 
private Button stopButton; 
private MediaRecorder mediaRecorder; 
private File audioFile; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_layout); 
    startButton = (Button) findViewById(R.id.button1); 
    startButton.setOnClickListener(this); 
    startButton.setText("start"); 

    stopButton = (Button) findViewById(R.id.button2); 
    stopButton.setOnClickListener(this); 
    stopButton.setEnabled(false); 
    stopButton.setText("stop"); 

    audioFile = new File(Environment.getExternalStorageDirectory(), 
      "audio_test4.3gp"); 
} 

// this process must be done prior to the start of recording 
private void resetRecorder() { 
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    mediaRecorder.setAudioEncodingBitRate(16); 
    mediaRecorder.setAudioSamplingRate(44100); 
    mediaRecorder.setOutputFile(audioFile.getAbsolutePath()); 

    try { 
     mediaRecorder.prepare(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.button1: 
     mediaRecorder = new MediaRecorder(); 
     resetRecorder(); 
     mediaRecorder.start(); 

     startButton.setEnabled(false); 
     stopButton.setEnabled(true); 
     break; 
    case R.id.button2: 
     mediaRecorder.stop(); 
     mediaRecorder.release(); 
     mediaRecorder = null; 

     startButton.setEnabled(true); 
     stopButton.setEnabled(false); 
     break; 
    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 

    if (mediaRecorder != null) { 
     mediaRecorder.stop(); 
     mediaRecorder.release(); 
     mediaRecorder = null; 
    } 
} 
} 
+1

呀,它的工作。谢谢,但我不知道有什么问题! –

+0

如果你打算投票,最好有礼貌地说出原因。否则,任何人如何从错误中学习? –