【问题标题】:How to determine the phone number of a current caller in a stand-alone application如何在独立应用程序中确定当前呼叫者的电话号码
【发布时间】:2012-02-21 23:12:18
【问题描述】:

我想构建一个 Android 应用程序,该应用程序可以通过预先确定的文本消息联系当前呼叫者。发送短信很简单,但在独立应用程序中确定当前呼叫者的电话号码是一项挑战。有没有一种简单的方法可以算出电话号码,以便我可以在通话时向他们发送消息?

当然有手动的方法来做到这一点:记下号码,将其键入新的短信,输入信息。但我想预先定义消息并能够“将其发送给当前调用者”。

【问题讨论】:

  • 请留下一些关于你到目前为止实际尝试过的代码。什么不起作用?我的例子似乎可以解决问题。

标签: android phone-number phone-call


【解决方案1】:
@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);
}
}

【讨论】:

  • 这是否意味着应用程序需要一直加载才能拦截这些调用状态?
  • @enforcer-99 我认为您不了解 BroadcastReciever 的概念。下面是来自 StackOverflow 的描述:“BroadcastReceiver 是一个响应系统范围广播公告的 Android 组件。”这是您应该真正阅读的来自谷歌的链接。因此......您正在响应系统范围的广播,并且您的应用程序并非“一直加载”。
【解决方案2】:

对于您的情况,我能想到的最好的方法是使用PhoneStateListener。它包含onCallStateChanged 处理程序。其中一个参数是一个包含传入电话号码的字符串。

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

Ctrl + F 并输入“Incoming”,你会找到你需要知道的一切。

编辑:为确保您的应用在手机启动时启动,只需添加一个 BroadcastReciever。 How to start an Application on startup?

【讨论】:

  • 但是如果用户在通话过程中才调用应用程序呢?由于不会有状态更改事件 - 我无法获得正确的数字?
  • 听起来您需要在启动时启动您的应用程序。这类似于“谷歌钱包”之类的应用程序所做的事情。当我去商店并点击手机付款时,我无需打开谷歌钱包就可以使用它。但是,当我打开手机并查看通知时,我发现“Google Wallet Initializing”真的很快,然后它就消失了。现在没有太多时间,但也许这会有所帮助:stackoverflow.com/questions/5290141/…
  • @enforcer-99 至少在我拥有的设备上,通话记录会在通话完成后更新。
  • 已确认 - 在通话期间检查最新来电者的通话记录会导致上一个来电者 - 而不是当前来电者。
  • 同意 - 看起来我可能只需要在启动时启动应用程序,并希望用户不要使用一些省电应用程序杀死它。我讨厌那样。询问电话“当前呼叫者是谁?”似乎很简单。我个人不喜欢一直在后台运行的应用程序。
【解决方案3】:

在您的清单中注册一个广播接收器以侦听ACTION_PHONE_STATE_CHANGED

指示呼叫状态(蜂窝)的广播意图操作 设备已更改。

EXTRA_STATE extra 表示新的呼叫状态。如果新状态 是RINGING,第二个额外的EXTRA_INCOMING_NUMBER 提供传入的 电话号码作为字符串。

需要READ_PHONE_STATE 权限。

这是 1.0 版中的粘性广播,但不再是 黏。而是使用getCallState()同步查询当前 调用状态。

这样您就不需要用户在接听电话之前启动您的应用程序。

【讨论】:

  • 这个怎么样? :“从 Android 3.1 开始,如果用户从未启动过相应的应用程序,或者如果用户通过 Android 菜单(在管理应用程序中)明确停止了应用程序,Android 系统将默认从接收 Intent 中排除所有 BroadcastReceiver。这是一个额外的安全功能,因为用户可以确保只有他启动的应用程序才会收到广播 Intent。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多