2012-02-21 48 views
5

我想構建一個Android應用程序,該應用程序可以通過預定義的文本消息與當前呼叫者聯繫。發送文本消息非常簡單,但在獨立應用程序中確定當前呼叫者的電話號碼是一項挑戰。有沒有一種簡單的方法來預測電話號碼,以便我可以在通話過程中向他們發送消息?如何在獨立應用程序中確定當前呼叫者的電話號碼

當然有手動的方法來做到這一點:寫下數字,將其鍵入一個新的文本消息,輸入消息。但是我想預先定義消息並能夠「將其發送給當前呼叫者」。

+0

請留下一些代碼,你到目前爲止已經嘗試過。什麼不行?我的例子似乎可以做到這一點。 – EGHDK 2013-01-12 21:47:34

回答

4
@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); 
} 
} 
+0

這是否意味着應用程序需要一直加載以攔截這些呼叫狀態? – 2013-01-17 13:39:22

+2

@ enforcer-99我不認爲你理解BroadcastReciever的概念。以下是來自StackOverflow的描述:「BroadcastReceiver是一個響應系統廣播通知的Android組件。」這裏是谷歌的鏈接,你應該*真正*閱讀。因此......您正在響應系統廣播,而您的應用程序並非「始終加載」。 – EGHDK 2013-01-17 23:48:35

3

對於你的sistuation最好的我能想到的是使用PhoneStateListener。它包含onCallStateChanged處理程序。其中一個參數是包含傳入電話號碼的字符串。

來源: http://developer.android.com/reference/android/telephony/PhoneStateListener.html

按Ctrl + F,鍵入 「來電」,你會發現你需要知道的一切。

編輯:爲了確保您的應用程序在您的手機啓動時啓動,只需添加一個BroadcastReciever。 How to start an Application on startup?

+0

但是,在電話通話已經進行之前,用戶不會調用該應用的情況如何?由於不會有狀態變化事件 - 我無法獲得正確的數字? – 2013-01-06 20:23:47

+0

聽起來像你會需要你的應用程序開始啓動。這與「Google電子錢包」等應用類似。當我去商店並點擊我的手機付款時,我從來不需要打開Goog​​le錢包就可以使用它。但是,當我打開手機並查看我的通知時,我發現「Google電子錢包初始化」非常快,然後就會消失。現在沒有很多時間,但是這可能會有所幫助:http://stackoverflow.com/questions/5290141/android-broadcastreceiver-on-startup – EGHDK 2013-01-06 21:09:09

+0

如果我剛剛檢查了Android通話記錄,該怎麼辦?如果我按日期DESC對列表進行排序,它會顯示當前正在撥打的電話,還是當前呼叫會在呼叫完成後被推送到通話記錄中? – 2013-01-12 21:35:37

1

在您的清單中註冊一個BroadcastReceiver,它接受ACTION_PHONE_STATE_CHANGED

廣播意圖動作指示呼叫狀態(蜂窩)上 設備已經改變。

EXTRA_STATE extra表示新的呼叫狀態。如果新狀態 是RINGING,則第二個額外的EXTRA_INCOMING_NUMBER將傳入的 電話號碼作爲字符串提供。要求READ_PHONE_STATE權限。

這是1.0版本的粘貼廣播,但它不再是 粘性。而是使用getCallState()來同步查詢當前的 呼叫狀態。

這樣你就不需要用戶在接到電話之前啓動你的應用程序。

+0

這個怎麼樣? :「從Android 3.1開始,如果相應的應用程序從未由用戶啓動過,或者用戶通過Android菜單(在管理應用程序中)明確停止了應用程序,則Android系統默認將所有BroadcastReceiver從接收內容中排除。 是一個額外的安全功能,因爲用戶可以確信只有他開始的應用程序纔會收到廣播意圖。「 – 2013-01-19 00:34:50

相關問題