我想構建一個Android應用程序,該應用程序可以通過預定義的文本消息與當前呼叫者聯繫。發送文本消息非常簡單,但在獨立應用程序中確定當前呼叫者的電話號碼是一項挑戰。有沒有一種簡單的方法來預測電話號碼,以便我可以在通話過程中向他們發送消息?如何在獨立應用程序中確定當前呼叫者的電話號碼
當然有手動的方法來做到這一點:寫下數字,將其鍵入一個新的文本消息,輸入消息。但是我想預先定義消息並能夠「將其發送給當前呼叫者」。
我想構建一個Android應用程序,該應用程序可以通過預定義的文本消息與當前呼叫者聯繫。發送文本消息非常簡單,但在獨立應用程序中確定當前呼叫者的電話號碼是一項挑戰。有沒有一種簡單的方法來預測電話號碼,以便我可以在通話過程中向他們發送消息?如何在獨立應用程序中確定當前呼叫者的電話號碼
當然有手動的方法來做到這一點:寫下數字,將其鍵入一個新的文本消息,輸入消息。但是我想預先定義消息並能夠「將其發送給當前呼叫者」。
@Override
public void onReceive(Context context, Intent intent) {
TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
PhoneCallStateListener customPhoneListener = new PhoneCallStateListener(context);
telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
helper = new ContactDatabaseHelper(context);
list = helper.getAllContacts();
try{
incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
if (list.size() != 0){
for (int i = 0, size = list.size(); i < size; i++){
if (PhoneNumberUtils.compare(incomingNumber, list.get(i).getContactNumber())){
ToastMsg.showToast(context,list.get(i).getContactName()+" Calling");
}
}
}
}catch (Exception e) {
// TODO: handle exception
}
}
public class PhoneCallStateListener extends PhoneStateListener{
private Context context;
public PhoneCallStateListener(Context context){
this.context = context;
}
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
break;
case PhoneStateListener.LISTEN_CALL_STATE:
}
super.onCallStateChanged(state, incomingNumber);
}
}
這是否意味着應用程序需要一直加載以攔截這些呼叫狀態? – 2013-01-17 13:39:22
@ enforcer-99我不認爲你理解BroadcastReciever的概念。以下是來自StackOverflow的描述:「BroadcastReceiver是一個響應系統廣播通知的Android組件。」這裏是谷歌的鏈接,你應該*真正*閱讀。因此......您正在響應系統廣播,而您的應用程序並非「始終加載」。 – EGHDK 2013-01-17 23:48:35
對於你的sistuation最好的我能想到的是使用PhoneStateListener
。它包含onCallStateChanged
處理程序。其中一個參數是包含傳入電話號碼的字符串。
來源: http://developer.android.com/reference/android/telephony/PhoneStateListener.html
按Ctrl + F,鍵入 「來電」,你會發現你需要知道的一切。
編輯:爲了確保您的應用程序在您的手機啓動時啓動,只需添加一個BroadcastReciever。 How to start an Application on startup?
但是,在電話通話已經進行之前,用戶不會調用該應用的情況如何?由於不會有狀態變化事件 - 我無法獲得正確的數字? – 2013-01-06 20:23:47
聽起來像你會需要你的應用程序開始啓動。這與「Google電子錢包」等應用類似。當我去商店並點擊我的手機付款時,我從來不需要打開Google錢包就可以使用它。但是,當我打開手機並查看我的通知時,我發現「Google電子錢包初始化」非常快,然後就會消失。現在沒有很多時間,但是這可能會有所幫助:http://stackoverflow.com/questions/5290141/android-broadcastreceiver-on-startup – EGHDK 2013-01-06 21:09:09
如果我剛剛檢查了Android通話記錄,該怎麼辦?如果我按日期DESC對列表進行排序,它會顯示當前正在撥打的電話,還是當前呼叫會在呼叫完成後被推送到通話記錄中? – 2013-01-12 21:35:37
在您的清單中註冊一個BroadcastReceiver,它接受ACTION_PHONE_STATE_CHANGED
。
廣播意圖動作指示呼叫狀態(蜂窩)上 設備已經改變。
EXTRA_STATE
extra表示新的呼叫狀態。如果新狀態 是RINGING
,則第二個額外的EXTRA_INCOMING_NUMBER
將傳入的 電話號碼作爲字符串提供。要求READ_PHONE_STATE
權限。這是1.0版本的粘貼廣播,但它不再是 粘性。而是使用
getCallState()
來同步查詢當前的 呼叫狀態。
這樣你就不需要用戶在接到電話之前啓動你的應用程序。
這個怎麼樣? :「從Android 3.1開始,如果相應的應用程序從未由用戶啓動過,或者用戶通過Android菜單(在管理應用程序中)明確停止了應用程序,則Android系統默認將所有BroadcastReceiver從接收內容中排除。 是一個額外的安全功能,因爲用戶可以確信只有他開始的應用程序纔會收到廣播意圖。「 – 2013-01-19 00:34:50
請留下一些代碼,你到目前爲止已經嘗試過。什麼不行?我的例子似乎可以做到這一點。 – EGHDK 2013-01-12 21:47:34