需求:设置来电后自动录音。

首先设置一个按钮,代码很简单这里就不再给出。

建一个类,RecorderServicer extends Service

  1. package com.ydl.recorder;
  2.  
  3. import java.io.IOException;
  4.  
  5. import android.app.Service;
  6. import android.content.Intent;
  7. import android.media.MediaRecorder;
  8. import android.os.IBinder;
  9. import android.telecom.TelecomManager;
  10. import android.telephony.PhoneStateListener;
  11. import android.telephony.TelephonyManager;
  12.  
  13. public class RecorderServicer extends Service {
  14.  
  15. private MediaRecorder recorder;
  16.  
  17. @Override
  18. public IBinder onBind(Intent intent) {
  19.  
  20. return null;
  21. }
  22.  
  23. @Override
  24. public void onCreate() {
  25. super.onCreate();
  26. TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
  27. //监听电话状态
  28. tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
  29.  
  30. }
  31.  
  32. class MyListener extends PhoneStateListener {
  33. @Override
  34. public void onCallStateChanged(int state, String incomingNumber) {
  35. // TODO Auto-generated method stub
  36. super.onCallStateChanged(state, incomingNumber);
  37.  
  38. switch (state) {
  39. case TelephonyManager.CALL_STATE_IDLE:
  40. System.out.println("空闲");
  41. if (recorder != null) {
  42. recorder.stop();// 停止录音
  43. recorder.release();
  44. recorder = null;
  45. }
  46.  
  47. break;
  48. case TelephonyManager.CALL_STATE_RINGING:
  49. System.out.println("响铃");
  50. // 进行初始化
  51. if (recorder != null) {
  52. recorder = new MediaRecorder();
  53. recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// Microphone
  54. // audio
  55. // source
  56. recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 设置输出3gp格式
  57. recorder.setOutputFile("sdcard/luyin.3gp");
  58. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 设置音频编码格式
  59. try {
  60. recorder.prepare();// 做好准备
  61. } catch (Exception e) {
  62. // TODO Auto-generated catch block
  63. e.printStackTrace();
  64. }
  65. }
  66.  
  67. break;
  68. case TelephonyManager.CALL_STATE_OFFHOOK:
  69. System.out.println("摘机");
  70.  
  71. // 开始录音
  72. if (recorder != null) {
  73. recorder.start();
  74. }
  75. default:
  76. break;
  77. }
  78. }
  79. }
  80.  
  81. }

在主活动界面设置按钮点击事件:用于启动上述服务

  1. package com.ydl.recorder;
  2.  
  3. import android.os.Bundle;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.view.Menu;
  7. import android.view.View;
  8.  
  9. public class MainActivity extends Activity {
  10.  
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. }
  16.  
  17. public void click(View v){
  18. Intent intent = new Intent(this, RecorderServicer.class);
  19. startService(intent);
  20.  
  21. }
  22. }

为了做的更逼真一些,设置开机启动服务:因此用到了上一章的开机广播机制

新建一个类:BootReceiver extends BroadcastReceiver   用于开机启动服务。因为服务是在后台的,不可见面,因此不必设置任务栈即不需要addFlags()方法

  1. package com.ydl.recorder;
  2.  
  3. import android.content.BroadcastReceiver;
  4. import android.content.Context;
  5. import android.content.Intent;
  6.  
  7. public class BootReceiver extends BroadcastReceiver {
  8.  
  9. //设置开机启动服务
  10.  
  11. @Override
  12. public void onReceive(Context context, Intent intent) {
  13. Intent it = new Intent(context, RecorderServicer.class);
  14. context.startService(it);
  15.  
  16. }
  17.  
  18. }

上述代码都是对系统进行操作,例如:监听电话状态、设置开机广播、写出数据到SDcard、设置录音方式。因此需要配置权限,同时上边的而广播和服务都要进行相应的配置。

清单文件的权限和服务广播注册如下:

  1. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  2. <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  3.  
  4. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  1. <service android:name="com.ydl.recorder.RecorderServicer"></service>
  2. <receiver android:name="com.ydl.recorder.BootReceiver">
  3. <intent-filter >
  4. <action android:name="android.intent.action.BOOT_COMPLETED"/>
  5. </intent-filter>
  6. </receiver>

Android初级教程实现电话录音的更多相关文章

  1. Android初级教程理论知识(第三章测试&数据存储&界面展现)

    首先介绍单元测试,我在javaweb部分有详细介绍单元测试框架的一篇文章. 可以先看在javaweb中的单元测试详解篇http://blog.csdn.net/qq_32059827/article/ ...

  2. Android初级教程:RatingBar的使用

    记得淘宝里面买家给卖家评分的时候会有一个星星状的评分条,其实就是基于RatingBar做了自定义使用了.那么本篇文章就对RatingBar的使用做一个基本的认识. 接下来就是正题,那就是对于Ratin ...

  3. Android初级教程反射+AIDL+内容观察者监控黑名单号码代码模板

    对于想要拦截一些莫名的陌生号码,就需要电话拦截功能与删除其电话记录功能.拦截的主要业务逻辑,分别是在一个服务里面进行:1.注册电话监听:2.取消注册电话监听(当然注册于取消是在服务里面建立一个广播接收 ...

  4. Android初级教程IP拨号器初识广播接受者

    需求:输入ip号码并且保存在本地,监听打电话广播,如果电话号码以0开头,则加上ip区号拨打. 首先定义一个页面布局: <LinearLayout xmlns:android="http ...

  5. Android初级教程理论知识(第六章广播接受者)

    总体概述: 广播接收者 现实中:电台要发布消息,通过广播把消息广播出去,使用收音机,就可以收听广播,得知这条消息 Android中:系统在运行过程中,会产生很多事件,那么某些事件产生时,比如:电量改变 ...

  6. Android初级教程理论知识(第五章页面跳转和数据传递)

    总体概述: Android四大组件 Activity BroadCastReceiver Service ContentProvider 创建第二个activity 新创建的activity,必须在清 ...

  7. Android初级教程理论知识(第一章快速入门)

    一.综合介绍. Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包, ...

  8. Android初级教程_获取Android控件的宽和高

    转载:http://blog.csdn.net/johnny901114/article/details/7839512 我们都知道在onCreate()里面获取控件的高度是0,这是为什么呢?我们来看 ...

  9. Android初级教程:ViewPage使用详解

    转载本博客,请注明出处:http://blog.csdn.net/qq_32059827点击打开链接 ViewPage使用之一就是轮播广告,就以此为出发点,来详细解析一下ViewPage的使用和加载机 ...

随机推荐

  1. BZOJ2989 数列(二进制分组)

    这题其实可以cdq分治做,但是如果强制在线的话,这里有个牛逼方法叫二进制分组. 它的基本思想是把修改操作按二进制分组,遇到修改就在尾部加一个,并与之前的合并,比如之前有23(16+4+2+1)个,加了 ...

  2. NTT+多项式求逆+多项式开方(BZOJ3625)

    定义多项式$h(x)$的每一项系数$h_i$,为i在c[1]~c[n]中的出现次数. 定义多项式$f(x)$的每一项系数$f_i$,为权值为i的方案数. 通过简单的分析我们可以发现:$f(x)=\fr ...

  3. java 实现WebService

    1.xml    2.    wsdl: webservice description language web服务描述语言        通过xml格式说明调用的地址方法如何调用,可以看错webse ...

  4. 使用JdbcTemplate 操作PostgreSQL,当where条件中有timestamp类型时,报错operator does not exist: timestamp w/out timezone

    今天遇到一个问题,找了还半天,Google一下,官网显示是一个bug. 思考一番肯定是类型出了问题. Controller: Service:转化时间戳 Dao: 一波转换搞定!

  5. JSON概述

    错误理解:         一直以为JSON就是对象,拥有跟js对象类似的特征:{key:value}形式, 以至于在自己的思维定式中就出现了一种很可怕的情景:居然不知道怎么去解释习以为常的json是 ...

  6. log4j不生成日志文件的问题

    直接看我的注解吧 注意地址的斜杠,还有地址别写什么相对地址了,这包太老了,服务器update一下兼容问题就出来了. #第一个参数定义达到什么程度就输出 第二第三....第N 定义输出的类型 #debu ...

  7. Linux系统格式化新磁盘并挂载分区

    Linux系统格式化新磁盘并挂载分区 在虚拟机的设置界面中,我们可以选择添加硬盘 添加好硬盘后,我们输入命令fdisk -l 看到有一个未经分区的硬盘 Fdisk命令编辑这个硬盘 输入n创建分区,p选 ...

  8. solr服务器搭建

    百度百科定义:Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Ht ...

  9. Laravel-admin 七牛云上传文件到七牛云出现卡顿失败情况

    由于所做项目需要管理后台众多,所以选择了Laravel-admin后台框架进行开发.节省了权限控制以及页面处理等问题的时间 Laravel-admin文档地址 http://laravel-admin ...

  10. Linux下DIR,dirent,stat等结构体详解

    摘自:http://www.liweifan.com/2012/05/13/linux-system-function-files-operation/ 最近在看Linux下文件操作相关章节,遇到了这 ...