安卓:如何存储SD卡内的音频记录 [英] Android : How to store recorded audio inside SD-card

查看:193
本文介绍了安卓:如何存储SD卡内的音频记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想记录与以下code音频。

I am trying to record audio with following code.

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

在点击链接我有以下code。

On button click i have following code.

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

所以它是默认打开的音频播放和录制音频和存储SD卡默认录制文件夹内。

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

所以,一切顺利,但问题是,我只想但存储此记录在SD卡与其他一些名称,像

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

文件夹的名称为 AudioRecording 并记录的名称为 audio.mp3 让我怎么能做到这一点。

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

我尝试过的一些解决方案,但它不为我工作。我知道这是一件容易的事,但一些如何我不能够理解了它。任何建议将高​​度AP preciated ..谢谢你在前进。

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.

推荐答案

下面我加入了通话记录样本源$ C ​​$ C。请尝试,让我知道。

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

希望这对我来说应该you.Its有益的工作的罚款。请尝试,让我知道。欲了解更多信息,请下载示例code形式

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

通话记录

这篇关于安卓:如何存储SD卡内的音频记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆