文章出處

Service:服務,可以理解成一個運行再后臺沒有界面的Activity,集成于Seriver,是四大組件之一

Service的繼承關系:Service-->ContextWrapper-->Context  (與activity一樣,都繼承與ContextWrapper);

 

生命周期:Context.startSeriver() 方法開啟服務:onCreate()-->onStartCommand()-->onDestory();

    第一次開啟服務,服務會執行onCreate()-->onStartCommand();(開啟之后再開啟服務,不會執行onCreate()方法);

     Context.bindSeriver() 方法開啟服務:onCreate()-->onBind()-->onUnbind()-->重載的方法返回true-->Rebind()-->onDestory();

 

開啟

   方式一:startService();

   方式二:bindService();

停止:

  方式一:stopService();

  方式二:unBind();

 

下面開始我們的來電監聽:

實現創建一個類繼承與Seriver:

 

 1 public class MyService extends Service {
 2     //創建一個錄音機的實例
 3     MediaRecorder recorder = null;
 4     //綁定服務
 5     @Nullable
 6     @Override
 7     public IBinder onBind(Intent intent) {
 8         return null;
 9     }
10 
11     //解綁服務
12     @Override
13     public void unbindService(ServiceConnection conn) {
14         super.unbindService(conn);
15     }
16 
17     //重新綁定服務
18     @Override
19     public void onRebind(Intent intent) {
20         super.onRebind(intent);
21     }
22 
23     //創建一個Service 第一次開啟的時候
24     @Override
25     public void onCreate() {
26         Log.i("wei","onCreate");
27         TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
28         tm.listen(new MyPhoneStateSeriverListener(),PhoneStateListener.LISTEN_CALL_STATE);
29         super.onCreate();
30 
31     }
32 
33     @Override
34     public int onStartCommand(Intent intent, int flags, int startId) {
35         Log.i("wei","onStartCommand");
36         return super.onStartCommand(intent, flags, startId);
37     }
38 
39     @Override
40     public void onDestroy() {
41         super.onDestroy();
42         Log.i("wei","onDestroy");
43     }
44     private class MyPhoneStateSeriverListener extends PhoneStateListener{
45         @Override
46         public void onCallStateChanged(int state, String incomingNumber) {
47             switch (state){
48                 case TelephonyManager.CALL_STATE_IDLE://空閑狀態
49                     if (recorder!=null){
50                         recorder.stop();
51                         recorder.reset();
52                         recorder.release();
53                     }
54                     break;
55                 case TelephonyManager.CALL_STATE_OFFHOOK://接聽狀態
56                     recorder.start();//開始錄音
57                     break;
58                 case TelephonyManager.CALL_STATE_RINGING://響鈴狀態
59                     recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);//設置音頻的來源  MIC只能錄單方的,VOICE_CALL可以錄雙方的
60                     recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//設置音頻的輸出格式
61                     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//設置音頻的編碼方式
62                     recorder.setOutputFile("/mnt/sdcard/luyin.3gp");//設置錄音文件的存儲位置
63                     try {
64                         recorder.prepare();//準備錄音
65                     } catch (IOException e) {
66                         e.printStackTrace();
67                     }
68                     break;
69             }
70             super.onCallStateChanged(state, incomingNumber);
71         }
72     }
73 }

 

Manifest.xml配置:

1 <uses-permission android:name="android.permission.RECORD_AUDIO"/>
2     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3     <uses-permission android:name="android.permission.READ_PHONE_STATE" />

 

報錯,空指針異常。

 

   


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()