2012-02-21 50 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

相关问题