需求分析

  1. 电话录音是在通话的时候进行录音,所以需要使用一个服务来完成功能。
  2. 需要监听电话的状态,分为三种状态: 
    1. 空闲状态 TelephonyManager.CALL_STATE_IDLE
    2. 响铃状态 TelephonyManager.CALL_STATE_RINGING
    3. 摘机状态 TelephonyManager.CALL_STATE_OFFHOOK
  3. 需要实现录音功能 ,详细文档请参考(http://developer.android.com/guide/topics/media/audio-capture.html)
  4. 可以加入开机启动这个服务。 

具体编码

manifest.xml文件 。需要申请四个权限,并实现服务,广播的注册。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.easzz.recorder">
  4. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  6. <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  7. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  8. <application
  9. android:allowBackup="true"
  10. android:icon="@mipmap/ic_launcher"
  11. android:label="@string/app_name"
  12. android:supportsRtl="true"
  13. android:theme="@style/AppTheme">
  14. <activity android:name=".MainActivity">
  15. <intent-filter>
  16. <action android:name="android.intent.action.MAIN" />
  17. <category android:name="android.intent.category.LAUNCHER" />
  18. </intent-filter>
  19. </activity>
  20. <service android:name=".RecorderService">
  21. </service>
  22. <receiver android:name=".BootReceiver">
  23. <intent-filter>
  24. <!--添加过滤实现开机启动-->
  25. <action android:name="android.intent.action.BOOT_COMPLETED"/>
  26. </intent-filter>
  27. </receiver>
  28. </application>
  29. </manifest>

通过一个Button按钮来启动该服务 MainActivity.java

  1. public class MainActivity extends AppCompatActivity {
  2. private Button btnRecorder;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. btnRecorder= (Button) findViewById(R.id.btn_recorder);
  8. //启动服务
  9. btnRecorder.setOnClickListener(new View.OnClickListener() {
  10. @Override
  11. public void onClick(View v) {
  12. Intent intent=new Intent(MainActivity.this,RecorderService.class);
  13. startService(intent);
  14. }
  15. });
  16. }
  17. }

服务的具体实现代码RecorderService.java

  1. /**
  2. * Created by Easzz on 2015/12/6.
  3. */
  4. public class RecorderService extends Service {
  5.  
  6. private MediaRecorder recorder; //录音的一个实例
  7.  
  8. @Override
  9. public IBinder onBind(Intent intent) {
  10. return null;
  11. }
  12.  
  13. @Override
  14. public void onCreate() {
  15. super.onCreate();
  16. //获得电话管理器
  17. TelephonyManager tm= (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
  18. //启动监听.传入一个listener和监听的事件,
  19. tm.listen(new MyListener(),PhoneStateListener.LISTEN_CALL_STATE);
  20.  
  21. }
  22. class MyListener extends PhoneStateListener{
  23.  
  24. //在电话状态改变的时候调用
  25. @Override
  26. public void onCallStateChanged(int state, String incomingNumber) {
  27. super.onCallStateChanged(state, incomingNumber);
  28. switch (state){
  29. case TelephonyManager.CALL_STATE_IDLE:
  30. //空闲状态
  31. if (recorder!=null){
  32. recorder.stop();//停止录音
  33. recorder.release();//释放资源
  34. recorder=null;
  35. }
  36. break;
  37.  
  38. case TelephonyManager.CALL_STATE_RINGING:
  39. //响铃状态 需要在响铃状态的时候初始化录音服务
  40. if (recorder==null){
  41. recorder=new MediaRecorder();//初始化录音对象
  42. recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置录音的输入源(麦克)
  43. recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置音频格式(3gp)
  44. createRecorderFile();//创建保存录音的文件夹
  45.  
  46. recorder.setOutputFile("sdcard/recorder" + "/" + getCurrentTime() + ".3gp"); //设置录音保存的文件
  47. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码
  48. try {
  49. recorder.prepare();//准备录音
  50. } catch (IOException e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. break;
  55. case TelephonyManager.CALL_STATE_OFFHOOK:
  56. //摘机状态(接听)
  57. if (recorder!=null){
  58. recorder.start(); //接听的时候开始录音
  59. }
  60. break;
  61. }
  62. }
  63.  
  64. //创建保存录音的目录
  65. private void createRecorderFile() {
  66. String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath();
  67.  
  68. String filePath=absolutePath+"/recorder";
  69. File file=new File(filePath);
  70. if (!file.exists()){
  71. file.mkdir();
  72. }
  73. }
  74. //获取当前时间,以其为名来保存录音
  75. private String getCurrentTime(){
  76. SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");
  77. Date date=new Date();
  78. String str=format.format(date);
  79. return str;
  80.  
  81. }
  82. }
  83. }

在开机广播中实现开机启动服务

  1. /**
  2. * Created by Easzz on 2015/12/6.
  3. */
  4. public class BootReceiver extends BroadcastReceiver {
  5. @Override
  6. public void onReceive(Context context, Intent intent) {
  7. Intent i=new Intent(context,RecorderService.class);
  8. //启动服务不需要到栈顶 ,因为没有前台界面。但是开机启动一个活动需要一个flag
  9. //i.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
  10. context.startService(i);
  11. }
  12. }

项目可以参考: https://github.com/aykuttasil/CallRecorder

Android实现电话录音功能的更多相关文章

  1. Android TelephonyManager电话管理器

    今天介绍一下Android的电话管理器--TelephonyManager,TelephonyManager管理手机通话状态.电话网络信息的服务类,获取TelephonyManager: Teleph ...

  2. android 调用电话功能

    今天用到了打电话的功能,这要如何实现呢? 很简单 1.创建对应对的xml展示页面喝java文件 2.在manifest中添加权限 下面上代码吧: 这是布局的一部分 <LinearLayout a ...

  3. android的电话监听

    android的电话监听 新建一个项目,结构图如下: PhoneService: package com.demo.tingdianhua; import android.app.Service; i ...

  4. Android 把电话保存到现有联系人 已有联系人

    搜索了很长时间,想找个把电话保存到现有联系人的代码,就是打开选中的联系人编辑界面,然后自动添加电话,再手动保存,就跟手机上的一样,功夫不负有心人,终于给搜到了,很不容易啊,现分享如下, // 保存至现 ...

  5. android服务之录音功能

    该服务的作用是当打电话时自动录音. 布局文件 布局文件中开启录音服务 <?xml version="1.0" encoding="utf-8"?> ...

  6. android之电话拨号器

    在android入门的案例中,除了HelloWorld这个经典案例,还有一个电话拨号器需要掌握,现在我就来个电话拨号器的示范,毕竟大牛也是从菜鸟进化而来的. 首先你应该知道自己要设置怎样的UI,然后创 ...

  7. Android 对电话进行监听和挂断

    1.添加权限 <!--拨打电话的权限--><uses-permission android:name="android.permission.PROCESS_OUTGOIN ...

  8. H5调用Android拨打电话

    1.AndroidAndJSInterface.java class AndroidAndJSInterface { /** * 该方法将被js调用,用于加载数据 */ @JavascriptInte ...

  9. Android实战--电话拨号器

    今天跟着黑马视频建立一个android app--电话拨号器 首先新建一个android项目 activity_main_xml中的代码如下: <RelativeLayout xmlns:and ...

随机推荐

  1. wtforms源码流程

    未实例化前 1.继承的Form类 # Form(FormMeta("NewBase", (BaseForm,), {}))# Form(NewBase(BaseForm)) cla ...

  2. 最小生成树之克鲁斯卡尔(kruskal)算法

    #include <iostream> #include <string> using namespace std; typedef struct MGraph{ string ...

  3. 关于Gevent的使用指北

    关于Gevent的使用指北 只是看了入门指南,和一个翻译文档.写一下个人读书心得. 其实看完之后,第一个反映就是asyncio这个系统库,感觉gevent现在所做的一些事情是与asyncio很像的,但 ...

  4. C#高级编程----错误和异常的总结

    错误和异常的总结 因为总结吗,,可能概念啥的比较多,大家要学着适应. 首先是C#中的异常用老处理系统级和用户级的错误状态,是一种结构化,统一的类型安全的处理机制. 因为鄙人开始想走C++的道路,所以搞 ...

  5. [CGAL]带岛多边形三角化

    CGAL带岛多边形三角化,并输出(*.ply)格式的模型 模型输出的关键是节点和索引 #include <CGAL/Triangulation_vertex_base_with_id_2.h&g ...

  6. centos安装memcached和PHP php-pecl-memcached.x86_64

    安装memcached sudo yum install memcached.x86_64 安装php-pecl-memcached php memcache有两个实现类 php-pecl-memca ...

  7. Data Structure Visualizations

    https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

  8. ERROR: Field * doesn't have a default value

    ERROR: Field 'status' doesn't have a default value 今天做项目,在插入数据时出现了这个从没遇到的异常,看了98%的异常分析都是针对组件id出现了类似的 ...

  9. Kriging插值法

    克里金法是通过一组具有 z 值的分散点生成估计表面的高级地统计过程.与插值工具集中的其他插值方法不同,选择用于生成输出表面的最佳估算方法之前,有效使用克里金法工具涉及 z 值表示的现象的空间行为的交互 ...

  10. 阿里云 ssh 登陆请使用(公)ip

    一直以为要要登陆使用的是私有的ip,最后才发现是使用共有ip, 如图 47.52.69.151 > ssh root@47.52.69.151 > 输入密码