Android实现电话录音功能
需求分析
- 电话录音是在通话的时候进行录音,所以需要使用一个服务来完成功能。
- 需要监听电话的状态,分为三种状态:
- 空闲状态 TelephonyManager.CALL_STATE_IDLE
- 响铃状态 TelephonyManager.CALL_STATE_RINGING
- 摘机状态 TelephonyManager.CALL_STATE_OFFHOOK
- 需要实现录音功能 ,详细文档请参考(http://developer.android.com/guide/topics/media/audio-capture.html)
- 可以加入开机启动这个服务。
具体编码
manifest.xml文件 。需要申请四个权限,并实现服务,广播的注册。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.easzz.recorder">
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".RecorderService">
</service>
<receiver android:name=".BootReceiver">
<intent-filter>
<!--添加过滤实现开机启动-->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
通过一个Button按钮来启动该服务 MainActivity.java
public class MainActivity extends AppCompatActivity {
private Button btnRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnRecorder= (Button) findViewById(R.id.btn_recorder);
//启动服务
btnRecorder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,RecorderService.class);
startService(intent);
}
});
}
}
服务的具体实现代码RecorderService.java
/**
* Created by Easzz on 2015/12/6.
*/
public class RecorderService extends Service { private MediaRecorder recorder; //录音的一个实例 @Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
super.onCreate();
//获得电话管理器
TelephonyManager tm= (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
//启动监听.传入一个listener和监听的事件,
tm.listen(new MyListener(),PhoneStateListener.LISTEN_CALL_STATE); }
class MyListener extends PhoneStateListener{ //在电话状态改变的时候调用
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state){
case TelephonyManager.CALL_STATE_IDLE:
//空闲状态
if (recorder!=null){
recorder.stop();//停止录音
recorder.release();//释放资源
recorder=null;
}
break; case TelephonyManager.CALL_STATE_RINGING:
//响铃状态 需要在响铃状态的时候初始化录音服务
if (recorder==null){
recorder=new MediaRecorder();//初始化录音对象
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置录音的输入源(麦克)
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置音频格式(3gp)
createRecorderFile();//创建保存录音的文件夹 recorder.setOutputFile("sdcard/recorder" + "/" + getCurrentTime() + ".3gp"); //设置录音保存的文件
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码
try {
recorder.prepare();//准备录音
} catch (IOException e) {
e.printStackTrace();
}
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
//摘机状态(接听)
if (recorder!=null){
recorder.start(); //接听的时候开始录音
}
break;
}
} //创建保存录音的目录
private void createRecorderFile() {
String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath(); String filePath=absolutePath+"/recorder";
File file=new File(filePath);
if (!file.exists()){
file.mkdir();
}
}
//获取当前时间,以其为名来保存录音
private String getCurrentTime(){
SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");
Date date=new Date();
String str=format.format(date);
return str; }
}
}
在开机广播中实现开机启动服务
/**
* Created by Easzz on 2015/12/6.
*/
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i=new Intent(context,RecorderService.class);
//启动服务不需要到栈顶 ,因为没有前台界面。但是开机启动一个活动需要一个flag
//i.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(i);
}
}
项目可以参考: https://github.com/aykuttasil/CallRecorder
Android实现电话录音功能的更多相关文章
- Android TelephonyManager电话管理器
今天介绍一下Android的电话管理器--TelephonyManager,TelephonyManager管理手机通话状态.电话网络信息的服务类,获取TelephonyManager: Teleph ...
- android 调用电话功能
今天用到了打电话的功能,这要如何实现呢? 很简单 1.创建对应对的xml展示页面喝java文件 2.在manifest中添加权限 下面上代码吧: 这是布局的一部分 <LinearLayout a ...
- android的电话监听
android的电话监听 新建一个项目,结构图如下: PhoneService: package com.demo.tingdianhua; import android.app.Service; i ...
- Android 把电话保存到现有联系人 已有联系人
搜索了很长时间,想找个把电话保存到现有联系人的代码,就是打开选中的联系人编辑界面,然后自动添加电话,再手动保存,就跟手机上的一样,功夫不负有心人,终于给搜到了,很不容易啊,现分享如下, // 保存至现 ...
- android服务之录音功能
该服务的作用是当打电话时自动录音. 布局文件 布局文件中开启录音服务 <?xml version="1.0" encoding="utf-8"?> ...
- android之电话拨号器
在android入门的案例中,除了HelloWorld这个经典案例,还有一个电话拨号器需要掌握,现在我就来个电话拨号器的示范,毕竟大牛也是从菜鸟进化而来的. 首先你应该知道自己要设置怎样的UI,然后创 ...
- Android 对电话进行监听和挂断
1.添加权限 <!--拨打电话的权限--><uses-permission android:name="android.permission.PROCESS_OUTGOIN ...
- H5调用Android拨打电话
1.AndroidAndJSInterface.java class AndroidAndJSInterface { /** * 该方法将被js调用,用于加载数据 */ @JavascriptInte ...
- Android实战--电话拨号器
今天跟着黑马视频建立一个android app--电话拨号器 首先新建一个android项目 activity_main_xml中的代码如下: <RelativeLayout xmlns:and ...
随机推荐
- Eclipse中修改包名,提交SVN时报 is out of date,怎么办?
问题:Eclipse中修改包名,提交SVN时报 is out of date,怎么办?描述: Hi,大家好! 我的问题如题,在不考虑用TortoiseSVN客户端直接删除目录这个方法的情况下,有什么方 ...
- JavaScript_几种创建对象(2017-07-04)
理解对象 1.创建Object实例 var clock = new Object(); clock.hour = 12; clock.minute = 10; clock.showHour = fun ...
- pycharm工具下代码下面显示波浪线的去处方法
近期安装了python后,发现使用pycharm工具打开代码后发现代码下边会有波浪线的显示:但是该代码语句确实没有错误,通过查询发现了两种方法去掉该波纹的显示,下面就具体说明一下: 方法一: 打开py ...
- 大文件拆分方案的java实践(附源码)
引子 大文件拆分问题涉及到io处理.并发编程.生产者/消费者模式的理解,是一个很好的综合应用场景,为此,花点时间做一些实践,对相关的知识做一次梳理和集成,总结一些共性的处理方案和思路,以供后续工作中借 ...
- python:函数的高级特性
很多语言中,都允许把函数本身做为参数,传递给其它参数:即所谓的高阶函数.python中也有类似特性: 一.map/reduce.filter.sorted hadoop里的map-reduce思想在p ...
- NSURLSession 相关清单
浅析 NSURLSession http://boboshone.com/blog/2013/10/21/nsurlsession-tutorial/ 介绍整体流程结构. iOS NSURL ...
- C# Queue 和Stack的实现
Queue 和Stack的使用就不用多说吧,一个是先进先出,一个是后进先出. 这里我主要关注其实现原理. queue的实现如下: public class Queue<T> : IEnum ...
- zabbix 中文乱码的处理
一.乱码原因 查看cpu负载,中文乱码如下 这个问题是由于zabbix的web端没有中文字库,我们最需要把中文字库加上即可 二.解决zabbix乱码方法 2.1 上传字体文件到zabbix中 找到本地 ...
- 使用Amalgamate将C/C++项目合并成一个.h/.c[pp]文件
简述 C/C++开源库一般是一堆的头文件和源文件,做到声明和实现分离,减小单个模块大小,这在设计上是很好的,但是用起来稍显麻烦.在网上看到有好心人推荐了一个开源工具Amalgamate,专门用来对C/ ...
- oracle访问不同用户的表不添加用户名前缀
问题的出现,是技术的不断推进.为了更好地实现价值的提升! 01.用视图 create view tab1 select * from B.tab1; //在A用户下执行 02.同义词 gr ...