Android開發之監聽手機來電

jopen 10年前發布 | 18K 次閱讀 Android Android開發 移動開發

    TelephonyManager是一個管理手機通話狀態、電話網絡信息的服務類,該類提供了大量的getXxx(),方法獲取電話網絡的相關信息。關于TelephonyManager的詳解可以參照:Android開發之獲取手機SIM卡信息</span></span></span>

程序運行結果:


log_phone文件:

20140722125204015.png

應用實例:


    package com.jph.monitorphone;

import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.PrintStream;  
import java.text.SimpleDateFormat;  
import java.util.Date;  
import android.os.Bundle;  
import android.app.Activity;  
import android.content.Context;  
import android.telephony.PhoneStateListener;  
import android.telephony.TelephonyManager;  
/** 
 * Describe:</br> 
 * 監視手機來電 
 * 本實例實現了監視當前手機的來電狀態, 
 * 并將來電與接聽紀錄寫入log_phone文件中 
 * @author jph 
 * Date:2014.07.22 
 * */  
public class MonitorPhone extends Activity {  
    TelephonyManager tManager;  
    private String incomingNumber;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        //獲取系統的TelephonyManager對象  
        tManager=(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
        //創建一個通話狀態監聽器  
        PhoneStateListener pListener=new PhoneStateListener(){  
            @Override  
            public void onCallStateChanged(int state, String number) {  
                // TODO Auto-generated method stub  
                switch (state) {  
                case TelephonyManager.CALL_STATE_IDLE://無任何狀態                     
                    break;  
                case TelephonyManager.CALL_STATE_OFFHOOK://接聽來電   
                    writeFile(state,number);  
                    break;  
                case TelephonyManager.CALL_STATE_RINGING://來電     
                    incomingNumber=number;  
                    writeFile(state,number);  
                    break;  
                default:  
                    break;  
                }                 
                super.onCallStateChanged(state, incomingNumber);  
            }             
        };  
        //為tManager添加監聽器  
        tManager.listen(pListener, PhoneStateListener.LISTEN_CALL_STATE);  
    }  
   //將接聽電話,與來電信息寫入到文件  
    protected void writeFile(int state, String number) {  
        // TODO Auto-generated method stub  
        StringBuffer sb=new StringBuffer();  
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh.mm.ss");  
        sb.append("時間:"+sdf.format(new Date())+"\n");  
        switch (state) {          
        case TelephonyManager.CALL_STATE_OFFHOOK://接聽來電   
            sb.append("接聽了電話號為:"+incomingNumber+"的電話");  
            break;  
        case TelephonyManager.CALL_STATE_RINGING://來電     
            sb.append(number+"來電");  
            break;        
        }  
        sb.append("\n-----------------------\n");  
        FileOutputStream fos=null;  
        try {  
            //以追加的方式打開輸出流  
            fos=openFileOutput("log_phone", MODE_APPEND);  

        } catch (FileNotFoundException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }         
        //將輸出流封裝成PrintStream對象  
        PrintStream ps=new PrintStream(fos);  
        //輸入文件內容  
        ps.println(sb.toString());  
        //關閉輸出流  
        ps.close();  
    }  
}  </pre><a href="/misc/goto?guid=4959555531880731292" target="_blank" title="派生到我的代碼片" style="text-indent:0;"></a></div>

</div>

    </div>
    最后別忘為應用添加相應的權限:

    AndroidManifest.xml


    </div> </div>

        <!-- 授予應用讀取通話狀態的權限 -->  
            <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  

    實例分析:

           本應用是通過Activity實現的,如果把實例中的代碼放到后臺執行的Service中運行,并設置Service組件跟隨系統啟動,那個這種監聽就可以做到“神不知,鬼不覺”了。嘿嘿.............

    來自:http://blog.csdn.net/fengyuzhengfan/article/details/38039549

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!