简体   繁体   中英

Android : How to store recorded audio inside SD-card

I am trying to record audio with following code.

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

On button click i have following code.

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

So it is opening default audio player and recording audio and storing inside SD-card default recording folder.

So everything goes fine but the problem is i want to store this recording in SD-card only but with some other name and in some other folder like

Name of folder is AudioRecording and name of recording is audio.mp3 so how can i do this.

I have tried some solution but it is not working for me. I know this is easy task but some how i am not able to figured it out. Any suggestions will be highly appreciated.. Thank you in advance.

Here i added the call recorder sample source code. Please try and let me know.

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;
}
}
}

Hope it should helpful for you.Its working fine for me. Please try and let me know. For more info please download the sample code form

Call Recorder

I think the best way to achieve this is converting that audio to a byte[] array. Assuming you have already done that, this should work:

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

Probably not your case, but mkdirs() method will try to construct all the parent directories if they're missing. As in your case you probably are making sure the user has an external card, this wouldn't be necessary (as the root directory is /sdcard ), but would be if you plan to store your files in a higher directory depth so it will create all the hierarchy automatically.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM