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

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

建一个类,RecorderServicer extends Service

package com.ydl.recorder;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.IBinder;
import android.telecom.TelecomManager;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager; public class RecorderServicer 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);
//监听电话状态
tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE); } class MyListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
// TODO Auto-generated method stub
super.onCallStateChanged(state, incomingNumber); switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
System.out.println("空闲");
if (recorder != null) {
recorder.stop();// 停止录音
recorder.release();
recorder = null;
} break;
case TelephonyManager.CALL_STATE_RINGING:
System.out.println("响铃");
// 进行初始化
if (recorder != null) {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// Microphone
// audio
// source
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 设置输出3gp格式
recorder.setOutputFile("sdcard/luyin.3gp");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 设置音频编码格式
try {
recorder.prepare();// 做好准备
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} break;
case TelephonyManager.CALL_STATE_OFFHOOK:
System.out.println("摘机"); // 开始录音
if (recorder != null) {
recorder.start();
}
default:
break;
}
}
} }

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

package com.ydl.recorder;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} public void click(View v){
Intent intent = new Intent(this, RecorderServicer.class);
startService(intent); }
}

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

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

package com.ydl.recorder;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent; public class BootReceiver extends BroadcastReceiver { //设置开机启动服务 @Override
public void onReceive(Context context, Intent intent) {
Intent it = new Intent(context, RecorderServicer.class);
context.startService(it); } }

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

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

 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<service android:name="com.ydl.recorder.RecorderServicer"></service>
<receiver android:name="com.ydl.recorder.BootReceiver">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</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. VC++6.0的使用方法

    VC++6.0的最基本使用方法,创建一个c++项目工程可参考:https://jingyan.baidu.com/article/8ebacdf0cbdb5749f75cd54a.html 这里面的操 ...

  2. 遗传算法:N皇后

    N皇后问题描述 N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 遗传算法 遗传算法是局部束搜索的变形: 与自 ...

  3. (MariaDB)开窗函数用法

    本文目录: 1.1 窗口和开窗函数简介 1.2 OVER()语法和执行位置 1.3 row_number()对分区排名 1.4 rank()和dense_rank() 1.5 percent_rank ...

  4. consul怎么在windows下安装

    1.去官网下载:https://www.consul.io/downloads.html 2.解压: 3.设置环境变量:path添加 E:\programfiles\consul: 4.cmd启动: ...

  5. 一看你就懂,超详细java中的ClassLoader详解

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 ClassLoader翻译过来就是类加载器,普通的Java开发者其实用到的不多,但对于某些框架开发者来说却非常常见.理解ClassL ...

  6. 89. Gray Code(中等,了解啥是 gray code)

    知道啥是 gray code 就是收获了. 下面介绍了 gray code 发明的 motivation, 了解动机后就知道啥是 gray code 了. https://zh.wikipedia.o ...

  7. Linux 查看CPU温度

    安装 lm-sensors sudo apt-get install lm-sensors # 安装yes | sudo sensors-detect # 侦测所有感测器 sensors # 查看温度 ...

  8. MeshCollider双面化脚本

    由于MeshCollider组件可以挂载多个,所以不需要Mesh重新合并了. 除了反转法线还需要反转所有三角面的顺序 脚本如下: using System.Collections; using Sys ...

  9. 利用Python进行数据分析——Ipython

    利用Python进行数据分析--Ipython 一.Ipython一些常用命令 1.TAB自动补全 2.变量+? 显示相关信息 3.函数名+??可以获取函数的代码 4.使用通配符* np.load? ...

  10. Docker 镜像

    Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序. 镜像可以用来创建 Docker 容器. D ...