2013-04-29 69 views
0

我試圖開發一個錄音應用程序,我可以開始和停止我的錄音。從邏輯上講,它應該用保存的音頻創建一個音頻文件。不幸的是,當我檢查文件時,沒有任何音頻。因此,我不太確定代碼中哪裏出錯。無法保存音頻文件,文件夾空

這是我的主要錄音機班。

package com.example.soundrecorder; 

    import java.io.File; 
    import java.io.IOException; 

    import android.app.Activity; 
    import android.content.ContentResolver; 
    import android.content.ContentValues; 
    import android.content.Intent; 
    import android.media.MediaRecorder; 
    import android.net.Uri; 
    import android.os.Bundle; 
    import android.os.Environment; 
    import android.provider.MediaStore; 
    import android.util.Log; 
    import android.view.View; 
    import android.widget.Toast; 

    public class SoundRecorder extends Activity { 

    MediaRecorder recorder; 
    File audiofile = null; 
    private static final String TAG = "SoundRecordingActivity"; 
    private View startButton; 
    private View stopButton; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    startButton = findViewById(R.id.start); 
    stopButton = findViewById(R.id.stop); 
    } 

    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) { 
     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.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(); 
    } 
    } 

還有就是我soundrecorder清單

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.soundrecorder" 
    android:versionCode="1" 
    android:versionName="1.0" > 

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

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

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
     android:name=".SoundRecorder" 
     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> 

    </manifest> 

回答

0

首先,你需要定義:

MediaRecorder mrec = new MediaRecorder(); 
File sampleDir = Environment.getExternalStorageDirectory(); 
File audiofile = File.createTempFile("ibm", ".mp4", sampleDir); 

,你需要定義FileProcessing功能:

protected void processaudiofile() 
{ 
    ContentValues values = new ContentValues(3); 
    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.MIME_TYPE, "audio/mp4"); 
    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)); 
} 

同時使用,並確保它都會工作roperly。

晚安。

+0

我需要替換什麼嗎?或者我只是複製並粘貼到我的代碼? – 2013-04-29 01:57:41

+0

我粘貼的代碼,但是,但我收到此錯誤。 默認構造函數不能處理由隱式超級構造函數拋出的異常類型IOException。必須在file.createtempfile行中定義一個顯式構造函數 – 2013-04-29 02:02:10