1. 程式人生 > >android 電話狀態監聽(來電和去電)實現程式碼

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

從事android開發的朋友們可能電話狀態監聽不是很擅長,接下來將詳細介紹電話狀態監聽功能的實現步驟,需要了解的朋友可以參考下。

實現手機電話狀態的監聽,主要依靠兩個類:TelephoneManger和PhoneStateListener。
TelephonseManger提供了取得手機基本服務的資訊的一種方式。因此應用程式可以使用TelephonyManager來探測手機基本服務的情況。應用程式可以註冊listener來監聽電話狀態的改變。我們不能對TelephonyManager進行例項化,只能通過獲取服務的形式:
Context.getSystemService(Context.TELEPHONY_SERVICE);
注意:對手機的某些資訊進行讀取是需要一定許可(permission)的。
主要靜態成員常量:(它們對應PhoneStateListener.LISTEN_CALL_STATE所監聽到的內容)
int CALL_STATE_IDLE 空閒狀態,沒有任何活動。
int CALL_STATE_OFFHOOK 摘機狀態,至少有個電話活動。該活動或是撥打(dialing)或是通話,或是 on hold。並且沒有電話是ringing or waiting
int CALL_STATE_RINGING 來電狀態,電話鈴聲響起的那段時間或正在通話又來新電,新來電話不得不等待的那段時間。
手機通話狀態在廣播中的對應值
EXTRA_STATE_IDLE 它在手機通話狀態改變的廣播中,用於表示CALL_STATE_IDLE狀態
EXTRA_STATE_OFFHOOK 它在手機通話狀態改變的廣播中,用於表示CALL_STATE_OFFHOOK狀態
EXTRA_STATE_RINGING 它在手機通話狀態改變的廣播中,用於表示CALL_STATE_RINGING狀態
ACTION_PHONE_STATE_CHANGED 在廣播中用ACTION_PHONE_STATE_CHANGED這個Action來標示通話狀態改變的廣播(intent)。
注:需要許可READ_PHONE_STATE。
String EXTRA_INCOMING_NUMBER
在手機通話狀態改變的廣播,用於從extra取來電號碼。
String EXTRA_STATE 在通話狀態改變的廣播,用於從extra取來通話狀態。

主要成員函式


public int getCallState() 取得手機的通話狀態。
public CellLocation getCellLocation () 返回手機當前所處的位置。如果當前定位服務不可用,則返回null
注:需要許可(Permission)ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION.
public int getDataActivity () 返回當前資料連線活動狀態的情況。
public int getDataState () 返回當前資料連線狀態的情況。
public String getDeviceId ()
返回手機的裝置ID。比如對於GSM的手機來說是IMEI碼,對於CDMA的手機來說MEID碼或ESN碼。如果讀取失敗,則返回null。

如何實現電話狀態的監聽呢?

Android在電話狀態改變是會發送action為android.intent.action.PHONE_STATE的廣播,而撥打電話時會發送action為android.intent.action.NEW_OUTGOING_CALL的廣播,但是我看了下開發文件,暫時沒發現有來電時的廣播。通過自定義廣播接收器,接受上述兩個廣播便可。 

 
package com.pocketdigi.phonelistener; 
import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 
public class PhoneReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
System.out.println("action"+intent.getAction()); 
//如果是去電 
if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){ 
String phoneNumber = intent 
.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
Log.d(TAG, "call OUT:" + phoneNumber); 
}else{ 
//查了下android文件,貌似沒有專門用於接收來電的action,所以,非去電即來電. 
//如果我們想要監聽電話的撥打狀況,需要這麼幾步 : 
* 第一:獲取電話服務管理器TelephonyManager manager = this.getSystemService(TELEPHONY_SERVICE); 
* 第二:通過TelephonyManager註冊我們要監聽的電話狀態改變事件。manager.listen(new MyPhoneStateListener(), 
* PhoneStateListener.LISTEN_CALL_STATE);這裡的PhoneStateListener.LISTEN_CALL_STATE就是我們想要 
* 監聽的狀態改變事件,初次之外,還有很多其他事件哦。 
* 第三步:通過extends PhoneStateListener來定製自己的規則。將其物件傳遞給第二步作為引數。 
* 第四步:這一步很重要,那就是給應用新增許可權。android.permission.READ_PHONE_STATE 
TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE); 
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); 
//設定一個監聽器 
} 
} 
PhoneStateListener listener=new PhoneStateListener(){ 
@Override 
public void onCallStateChanged(int state, String incomingNumber) { 
//注意,方法必須寫在super方法後面,否則incomingNumber無法獲取到值。 
super.onCallStateChanged(state, incomingNumber); 
switch(state){ 
case TelephonyManager.CALL_STATE_IDLE: 
System.out.println("結束通話"); 
break; 
case TelephonyManager.CALL_STATE_OFFHOOK: 
System.out.println("接聽"); 
break; 
case TelephonyManager.CALL_STATE_RINGING: 
System.out.println("響鈴:來電號碼"+incomingNumber); 
//輸出來電號碼 
break; 
} 
} 
}; 
} 
要在AndroidManifest.xml註冊廣播接收器:
 
<receiver android:name=".PhoneReceiver"> 
<intent-filter> 
<action android:name="android.intent.action.PHONE_STATE"/> 
<action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
</intent-filter> 
</receiver> 
<receiver android:name=".PhoneReceiver"> <intent-filter> <action android:name="android.intent.action.PHONE_STATE"/> <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> </intent-filter> </receiver> 

還要新增許可權:
 
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission> 

您可能感興趣的文章:

相關推薦

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

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

71.android 簡單的電話錄音並儲存到本地(來電都支援)

 //第一步 先加許可權 在AndroidManifest.xml裡: //有打電話的許可權,讀寫許可權,還有錄音許可權。  <uses-permission android:name="android.permission.CALL_PHONE" />

Android 耳機狀態

專案中遇到這樣的需求,要求監聽耳機插拔狀態變化,進行埋點上報處理,把實現程式碼分享一下。 public class MainActivity extends AppCompatActivity { private static final String TAG

電話狀態

今天接到一個監聽狀態的需求,當使用 App 時若電話介入需要對當前狀態進行監聽操作(注:並非通話內容),根據不同的狀態實行相關的需求操作,廢話不多說步驟如下.首先,常規操作先引用對應的標頭檔案,來為後續功能鋪路.#import <CoreTelephony/CTCall

Android中如何手機電話狀態

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

Android中檢查、電量充電狀態的方法

當你在更改後臺更新頻率來減少這些更新對電池壽命的影響時,檢查當前電量和充電狀態是一個好的開始。 電池壽命通過剩餘電量和充電狀態來影響應用更新的執行。當用交流電充電時,執行更新操作對裝置的影響是微不足道的,所以在大多數案例裡,你可以把更新頻率調到最快。如果裝置不在充電,降低更新頻率可以幫助延長電池壽命。

android來電廣播

要監聽android打電話和接電話,只需下面2步驟1.第一步,寫一個Receiver繼承自BroadcastReceiver class MyPhoneStateListener extends PhoneStateListener { @Overr

如何實現android來電並生成懸浮窗體提示

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

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

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

Android 簡訊(同時廣播資料庫)

暗釦,強烈譴責這種侵害使用者利益的行為。。。 下面給大家介紹Android暗釦原理.......  Android4.4以下的系統玩遊戲就要小心了哈 暗釦方式之一:簡訊訂購,即監聽--------攔截------------處理簡訊。 暗釦方式之二:模擬人為操作(又叫模擬流

Android開發之手機來電

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

android SIM卡狀態TelephonyManager

/* 監聽sim狀態改變的廣播,返回sim卡的狀態, 有效或者無效。 雙卡中只要有一張卡的狀態有效即返回狀態為有效,兩張卡都無效則返回無效。 */ import android.app.Service; import andr

android 網路實時網路狀態變化 及 網路型別判斷

android 中 我們經常需要判斷 各種網路型別   然後需要給使用者做出相應的提示,一般網路型別有 2g ,3g,4g ,wifi,無網路等等。 1. 網路型別判斷 TelephonyManag

39.android EditText的,改變按鈕狀態顏色+輸入長度固定+限制輸入的字元

//EditText的監聽 mEd.addTextChangedListener(watcher); //監聽輸入框軟鍵盤 達到8位就變顏色 private TextWatcher watcher = new TextWatcher() { @Overri

Android BroadcastReceiver + 藍芽狀態Demo

1、BroadcastReceiver基礎 動態註冊 靜態註冊 動態繫結 動態登出 實現靜態登出【其實就是設定不去響應,並沒有所謂登出】 2、程式碼走起 MyBroadcast: 會在MianActivity中使用程式碼動態註冊它 package

Android bluetooth裝置狀態

public class BluetoothHeadsetBroadcastReceiver extends BroadcastReceiver { public BluetoothHeadsetBroadcastReceiver() { } p

android HorizontalScrollView實現滾動狀態

網上大部分都是直接呼叫onScrollChanged(int x, int y, int oldx, int oldy) 這個方法的,實際上只是將這個方法的protected改為public而已,本質上上還是沒有什麼多大的幫助,不多說,直接上程式碼 package co

Android 程式實時網路變化狀態

public class MainActivity extends AppCompatActivity { private TextView tv; @Override protected void onCreate(Bundle savedInst

Android 文本接口TextWatcher詳解

n) sta listener ret vertical ear top ica lock TextWatcher是一個用來監聽文本變化的接口,使用該接口可以很方便的對可顯示文本控件和可編輯文本控件中的文字進行監聽和修改 TextWatcher接口中定義了三個方法: p

ASP.NET Core 發布之後通過命令控制地址環境變量

運行 mman oid build ted inf str comm staging 添加Command支持 新建一個ASP.NET Core 項目,打開Program.cs 添加下面的代碼: public class Program { public static