1. 程式人生 > >Android開發之監聽手機來電

Android開發之監聽手機來電

      TelephonyManager是一個管理手機通話狀態、電話網路資訊的服務類,該類提供了大量的getXxx(),方法獲取電話網路的相關資訊。關於

程式執行結果:

log_phone檔案:


應用例項:

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();
	}
}

最後別忘為應用新增相應的許可權:

AndroidManifest.xml

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

例項分析:

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

相關推薦

Android開發手機來電

      TelephonyManager是一個管理手機通話狀態、電話網路資訊的服務類,該類提供了大量的getXxx(),方法獲取電話網路的相關資訊。關於 程式執行結果: log_phone檔案: 應用例項: package com.jph.monitorphone;

Android開發或獲取手機簡訊內容

最近開始學習安卓,要做一個可以監聽手機簡訊的內容,做個筆記,方便以後檢視 有兩種方式: 方式一:通過廣播監聽簡訊資訊 註冊一個廣播接收器 <receiver android:name="接收器包名"> <intent-filte

Android開發發出的簡訊

       為了監聽指定的ContentProvider的資料的改變,需要通過ContentResolver向指定Uri註冊CotentObserver監聽器。ContentResolver提供瞭如下方法來註冊監聽器:   publicfinal void registerContentObserver(

Android開發軟鍵盤狀態(彈出收回)

概述 如何使用 隱患 概述 在我們開發過程中,有時需要監聽手機軟鍵盤狀態,但是Android沒有這樣的API,所以需要我們自己處理。 實現方案 實現效果與原理 先上一張效果圖 可以看到我們準確的監聽到了軟鍵盤的彈出與收起事

Android開發 返回鍵,彈出一個退出對話方塊

Android 如何監聽返回鍵點選事件,並建立一個退出對話方塊,防止自己寫的應用程式不小心點選退出鍵而直接退出。 自己記錄下這個簡單的demo,備用。 注:如下程式碼當時是從網上copy過來的,現在忘了它出自哪個原作者了,在此說聲抱歉。 原始碼如下: public

Android手機來電及狀態

在專案中,需要監聽手機來電和簡訊息。 手機來電沒有專門的廣播,但是Android中有關於電話狀態改變的廣播:android.intent.action.PHONE_STATE。 其中撥電話廣播:android.intent.action.NEW_OUTGOING_CA

android開發 事件

第一種:匿名內部類作為事件監聽器類  大部分時候,事件處理器都沒有什麼利用價值(可利用程式碼通常都被抽象成了業務邏輯方法),因此大部分事件監聽器只是臨時使用一次,所以使用匿名內部類形式的事件監聽器更合適,實際上,這種形式是目前是最廣泛的事件監聽器形式。上面的程式程式碼就是匿名內部類來建

Android中如何手機電話狀態

問題描述:當應用中需要對來電這一狀態進行處理時(例如來電時顯示來電話號碼歸屬地等),就需要對電話狀態進行監聽。 解決步驟:1.對電話狀態的監聽最好是放在服務中,因為有一種服務的啟動方式可以不依賴於activity的生命週期,即使activity被銷燬,服務依然在後臺執行。因

Android開發華為手機無法看log日誌解決方法(親測可用華為榮耀6)

華為榮耀的測試機,發現在Android Studio下無法檢視log日誌,看不了日誌就不方便解決問題了。 解決方法: 進入手機撥號介面輸入:*#*#2846579#*#*依次選擇ProjectMenu—後臺設定—-LOG設定—LOG開關 點選開啟, 點LOG級別選V

Android:TelephonyManager,MyPhoneStateListener手機訊號強度

import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.telephony.PhoneStateListener; impor

Android開發-button事件

一、實現button點選事件的方法   實現button點選事件的監聽方法有很多種,這裡總結了常用的四種方法:   1、匿名內部類   2、外部類(獨立類)   3、實現OnClickListener介面   4、新增XML屬性   每一種方法都有它的優點也有它的不足,那麼接下來就來詳細的講解這四個實現方法

Android開發電話服務、SMS簡訊

電話服務 //檢測裝置是否有電話硬體 boolean telephonySupported = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); //獲得電話型別

使用ionic開發時用遇到手機返回按鈕的問題~

log key gin tlist dex oot als ack location 當時用的是ionic開發一個app,需求是,當按下手機的返回按鈕,在指定的頁面雙擊退出,而在其他頁面點擊一次返回到上個頁面; 其實用ionic自帶的服務就可以解決: //雙擊退出

Android開發仿手機衛士懸浮窗效果

wrap 使用 indexof handle post ani refresh stat gen 基本的實現原理,這種桌面懸浮窗的效果很類似與Widget,但是它比Widget要靈活的多。主要是通過WindowManager這個類來實現的,調用這個類的addView方法用於

Android開發獲取SIM卡資訊和手機號碼

獲取SIM卡資訊和手機號碼的工具類,記錄一下方便以後使用 import android.content.Context; import android.telephony.TelephonyManager; /** * Created by WangJinyong on 20

Android 手機按下Home鍵

系統本身有這個廣播,只需要監聽這個廣播就可以了! private BroadcastReceiver mHomeKeyEventReceiver = new BroadcastReceiver() { String SYSTEM_REASON = "reaso

Android開發獲取手機硬體狀態資訊(CPU資訊/頻率/使用率、DDR頻率/使用率、電池瞬時電流/電壓/庫倫counter)

有時候我們想要知道當前手機的一些狀態資訊,可以使用app(root 或者系統簽名 )來顯示獲取。 OK,接下來看一下一些關鍵的程式碼。 我這裡使用的是高通的手機,不同硬體平臺的機型,其獲取資訊的節點可能不一樣。 /** * 獲取當前瞬時電流

AndroidView的兩個指頭是放大和縮小

我們有時需要對view進行手勢監聽,通過兩個手指開始距離和結束距離,來判斷放大縮小,下面是實現程式碼,所有View通用。 private double nLenStart = 0;//監聽 WebView所用手勢 @Override public boolean on

android】解決方案--用BroadcastReceiver手機網路狀態變化

實現一個功能,可以有很多種方法,但我們所追求的是最適合於自己專案的那一種方法。 就比如app要判斷網路狀態,如果在每次使用網路的時候去判斷一次網路狀態的話,有些耗費時間。例如,你要在開啟網頁之前先判斷網路是否暢通以及在下載圖片之前判斷網路型別,那麼務必造成等待時間的增加

android 電話狀態(來電和去電)實現程式碼

從事android開發的朋友們可能電話狀態監聽不是很擅長,接下來將詳細介紹電話狀態監聽功能的實現步驟,需要了解的朋友可以參考下。 實現手機電話狀態的監聽,主要依靠兩個類:TelephoneManger和PhoneStateListener。 TelephonseMange