2014-01-31 73 views
0

我想用下面的代碼錄製音頻。Android:如何在SD卡內存儲錄製的音頻

public static final int CAPTURE_AUDIO = 0; 
     .... 
     .... 

按鈕點擊我有以下代碼。

Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); 
startActivityForResult(intent,CAPTURE_AUDIO); 

因此它打開默認的音頻播放器和錄製音頻並存儲在SD卡默認錄製文件夾內。

所以一切順利,但問題是,我只想但存儲這些記錄在SD卡與其他一些名字和一些其他文件夾一樣

文件夾的名稱是AudioRecording和記錄的名字是audio.mp3所以我該如何做到這一點。

我嘗試了一些解決方案,但它不適合我。我知道這是一件容易的事,但有些我卻無法想象出來。任何建議將高度讚賞..預先感謝您。

+0

請上傳錄音代碼。 – user3243163

+0

你知道創建的文件嗎?你有沒有試過用你想要的名字複製文件到你想要的位置? – Gusdor

+0

我打開默認的Android錄音機通過意圖。所以它會自動打開默認錄音。所以沒有代碼記錄 – InnocentKiller

回答

0

我認爲最好的方法是將音頻轉換爲byte[]陣列。假設你已經這樣做了,這應該工作:

final File soundFile = new File("/sdcard/AudioRecording/"); 
soundFile.mkdirs(); 
final File outFile = new File(soundFile, 'audiofile.mp3'); 

try { 
    final FileOutputStream output = new FileOutputStream(outFile); 
    output.write(yourByteArrayWithYourAudioFileConverted); 
    output.close(); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

也許不是你的情況,但mkdirs()方法試圖建立所有,如果他們缺少的父目錄。在你的情況下,你可能會確保用戶有一個外部卡,這是不必要的(因爲根目錄是/sdcard),但是如果你打算將文件存儲在更高的目錄深度,所以它會創建所有的層次自動。

3

這裏我添加了呼叫記錄器示例源代碼。請嘗試讓我知道。

RecordService.java

import java.io.File; 
import java.io.IOException; 
import java.lang.Exception; 
import java.util.Date; 
import java.text.SimpleDateFormat; 
import android.os.IBinder; 
import android.app.Service; 
import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.preference.PreferenceManager; 
import android.content.SharedPreferences; 
import android.content.Context; 
import android.content.Intent; 
import android.media.MediaRecorder; 
import android.widget.Toast; 
import android.util.Log; 
import java.io.InputStream; 
import java.io.FileInputStream; 
import java.util.Iterator; 

public class RecordService 
extends Service 
implements MediaRecorder.OnInfoListener, MediaRecorder.OnErrorListener 
{ 
private static final String TAG = "CallRecorder"; 

public static final String DEFAULT_STORAGE_LOCATION = "/sdcard/AudioRecording"; 
private static final int RECORDING_NOTIFICATION_ID = 1; 
private MediaRecorder recorder = null; 
private boolean isRecording = false; 
private File recording = null;; 
private final int audioformat = 3; 


private File makeOutputFile (SharedPreferences prefs) 
{ 
File dir = new File(DEFAULT_STORAGE_LOCATION); 

// test dir for existence and writeability 
if (!dir.exists()) { 
    try { 
     dir.mkdirs(); 
    } catch (Exception e) { 
     Log.e("CallRecorder", "RecordService::makeOutputFile unable to create directory " + dir + ": " + e); 
     Toast t = Toast.makeText(getApplicationContext(), "CallRecorder was unable to create the directory " + dir + " to store recordings: " + e, Toast.LENGTH_LONG); 
     t.show(); 
     return null; 
    } 
} else { 
    if (!dir.canWrite()) { 
     Log.e(TAG, "RecordService::makeOutputFile does not have write permission for directory: " + dir); 
     Toast t = Toast.makeText(getApplicationContext(), "CallRecorder does not have write permission for the directory directory " + dir + " to store recordings", Toast.LENGTH_LONG); 
     t.show(); 
     return null; 
    } 
} 

// test size 

// create filename based on call data 
String prefix = "call"; 
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd_HH:MM:SS"); 
//prefix = sdf.format(new Date()) + "-callrecording"; 

// add info to file name about what audio channel we were recording 
prefix += "-channel" + 1 + "-"; 

// create suffix based on format 
String suffix = ""; 
switch (audioformat) { 
case MediaRecorder.OutputFormat.THREE_GPP: 
    suffix = ".3gpp"; 
    break; 
case MediaRecorder.OutputFormat.MPEG_4: 
    suffix = ".mpg"; 
    break; 
case MediaRecorder.OutputFormat.RAW_AMR: 
    suffix = ".amr"; 
    break; 
} 

try { 
    return File.createTempFile(prefix, suffix, dir); 
} catch (IOException e) { 
    Log.e("CallRecorder", "RecordService::makeOutputFile unable to create temp file in " + dir + ": " + e); 
    Toast t = Toast.makeText(getApplicationContext(), "CallRecorder was unable to create temp file in " + dir + ": " + e, Toast.LENGTH_LONG); 
    t.show(); 
    return null; 
} 
} 

public void onCreate() 
{ 
super.onCreate(); 
recorder = new MediaRecorder(); 
Log.i("CallRecorder", "onCreate created MediaRecorder object"); 
} 

public void onStart(Intent intent, int startId) { 
Log.i("CallRecorder", "RecordService::onStartCommand called while isRecording:" + isRecording); 

if (isRecording) return; 

Context c = getApplicationContext(); 
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c); 

Boolean shouldRecord = prefs.getBoolean(Preferences.PREF_RECORD_CALLS, false); 
if (!shouldRecord) { 
    Log.i("CallRecord", "RecordService::onStartCommand with PREF_RECORD_CALLS false, not recording"); 
    //return START_STICKY; 
    return; 
} 
recording = makeOutputFile(prefs); 
if (recording == null) { 
    recorder = null; 
    return; //return 0; 
} 

    try { 
    // These calls will throw exceptions unless you set the 
    // android.permission.RECORD_AUDIO permission for your app 
    recorder.reset(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(audioformat); 
    Log.d("CallRecorder", "set output " + audioformat); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
    Log.d("CallRecorder", "set encoder default"); 
    recorder.setOutputFile(recording.getAbsolutePath()); 
    Log.d("CallRecorder", "set file: " + recording); 
    //recorder.setMaxDuration(msDuration); //1000); // 1 seconds 
    //recorder.setMaxFileSize(bytesMax); //1024*1024); // 1KB 

    recorder.setOnInfoListener(this); 
    recorder.setOnErrorListener(this); 

    try { 
     recorder.prepare(); 
    } catch (java.io.IOException e) { 
     Log.e("CallRecorder", "RecordService::onStart() IOException attempting recorder.prepare()\n"); 
     Toast t = Toast.makeText(getApplicationContext(), "CallRecorder was unable to start recording: " + e, Toast.LENGTH_LONG); 
     t.show(); 
     recorder = null; 
     return; //return 0; //START_STICKY; 
    } 
    Log.d("CallRecorder", "recorder.prepare() returned"); 

    recorder.start(); 
    isRecording = true; 
    Log.i("CallRecorder", "recorder.start() returned"); 
    updateNotification(true); 
} catch (java.lang.Exception e) { 
    Toast t = Toast.makeText(getApplicationContext(), "CallRecorder was unable to start recording: " + e, Toast.LENGTH_LONG); 
    t.show(); 

    Log.e("CallRecorder", "RecordService::onStart caught unexpected exception", e); 
    recorder = null; 
} 

return; //return 0; //return START_STICKY; 
} 

public void onDestroy() 
{ 
super.onDestroy(); 

if (null != recorder) { 
    Log.i("CallRecorder", "RecordService::onDestroy calling recorder.release()"); 
    isRecording = false; 
    recorder.release(); 
    Toast t = Toast.makeText(getApplicationContext(), "CallRecorder finished recording call to " + recording, Toast.LENGTH_LONG); 
    t.show(); 
} 

updateNotification(false); 
} 


// methods to handle binding the service 

public IBinder onBind(Intent intent) 
{ 
return null; 
} 

public boolean onUnbind(Intent intent) 
{ 
return false; 
} 

public void onRebind(Intent intent) 
{ 
} 


private void updateNotification(Boolean status) 
{ 
Context c = getApplicationContext(); 
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c); 

String ns = Context.NOTIFICATION_SERVICE; 
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); 

if (status) { 
    int icon = R.drawable.rec; 
    CharSequence tickerText = "Recording call from channel " + prefs.getString(Preferences.PREF_AUDIO_SOURCE, "1"); 
    long when = System.currentTimeMillis(); 

    Notification notification = new Notification(icon, tickerText, when); 

    Context context = getApplicationContext(); 
    CharSequence contentTitle = "CallRecorder Status"; 
    CharSequence contentText = "Recording call from channel..."; 
    Intent notificationIntent = new Intent(this, RecordService.class); 
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 

    notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); 
    mNotificationManager.notify(RECORDING_NOTIFICATION_ID, notification); 
} else { 
    mNotificationManager.cancel(RECORDING_NOTIFICATION_ID); 
} 
} 

// MediaRecorder.OnInfoListener 
public void onInfo(MediaRecorder mr, int what, int extra) 
{ 
Log.i("CallRecorder", "RecordService got MediaRecorder onInfo callback with what: " + what + " extra: " + extra); 
isRecording = false; 
} 

// MediaRecorder.OnErrorListener 
public void onError(MediaRecorder mr, int what, int extra) 
{ 
Log.e("CallRecorder", "RecordService got MediaRecorder onError callback with what: " + what + " extra: " + extra); 
isRecording = false; 
mr.release(); 
} 
} 

PhoneListener.java

import android.content.Intent; 
import android.content.Context; 
import android.content.ComponentName; 
import android.telephony.TelephonyManager; 
import android.telephony.PhoneStateListener; 
import android.util.Log; 

public class PhoneListener extends PhoneStateListener 
{ 
private Context context; 

public PhoneListener(Context c) { 
Log.i("CallRecorder", "PhoneListener constructor"); 
context = c; 
} 

public void onCallStateChanged (int state, String incomingNumber) 
{ 
Log.d("CallRecorder", "PhoneListener::onCallStateChanged state:" + state + " incomingNumber:" + incomingNumber); 

switch (state) { 
case TelephonyManager.CALL_STATE_IDLE: 
    Log.d("CallRecorder", "CALL_STATE_IDLE, stoping recording"); 
    Boolean stopped = context.stopService(new Intent(context, RecordService.class)); 
    Log.i("CallRecorder", "stopService for RecordService returned " + stopped); 
    break; 
case TelephonyManager.CALL_STATE_RINGING: 
    Log.d("CallRecorder", "CALL_STATE_RINGING"); 
    break; 
case TelephonyManager.CALL_STATE_OFFHOOK: 
    Log.d("CallRecorder", "CALL_STATE_OFFHOOK starting recording"); 
    Intent callIntent = new Intent(context, RecordService.class); 
    ComponentName name = context.startService(callIntent); 
    if (null == name) { 
     Log.e("CallRecorder", "startService for RecordService returned null ComponentName"); 
    } else { 
     Log.i("CallRecorder", "startService returned " + name.flattenToString()); 
    } 
    break; 
} 
} 
} 

希望它應該爲我工作的罰款you.Its很有幫助。請嘗試讓我知道。欲瞭解更多信息,請下載樣片代碼表

Call Recorder

+0

謝謝你的回覆,但我想開始只用Intent錄製,我不想使用'MediaRecorder'。 – InnocentKiller