Android 如何在独立应用程序中确定当前呼叫者的电话号码

Android 如何在独立应用程序中确定当前呼叫者的电话号码,android,phone-number,phone-call,Android,Phone Number,Phone Call,我想构建一个Android应用程序,它可以通过预先确定的文本消息与当前来电者联系。发送短信很简单,但在独立应用程序中确定当前呼叫者的电话号码是一项挑战。有没有一个简单的方法来预测电话号码,这样我就可以在通话时给他们发信息 当然,也有一些手动方法可以做到这一点:记下号码,在新的文本消息中键入,然后输入消息。但我想预先定义消息,并能够“将其发送给当前的调用者” 对于您的系统,我能想到的最好方法是使用phonestateslistener。它包含onCallStateChanged处理程序。其中一个参

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


当然,也有一些手动方法可以做到这一点:记下号码,在新的文本消息中键入,然后输入消息。但我想预先定义消息,并能够“将其发送给当前的调用者”

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

资料来源:

按住Ctrl+F键并键入“Incoming”,您将找到需要了解的所有信息


编辑:要确保您的应用程序在手机启动时启动,只需添加一个广播接收器即可

在您的清单中注册一个侦听的BroadcastReceiver

广播意图动作,指示呼叫状态(蜂窝)开启 设备已更改

EXTRA_状态
EXTRA表示新的呼叫状态。如果新国家 当
铃声响起时
,第二个额外的
额外的进站号码
提供进站信息 电话号码作为字符串

需要
READ\u PHONE\u状态
权限

在1.0版中,这是一个粘性广播,但现在不再是了 粘性的相反,使用
getCallState()
同步查询当前 呼叫状态

这样,您就不需要用户在接到呼叫之前启动应用程序。

@Override
@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);
}
}
公共void onReceive(上下文、意图){ TelephonyManager telephony=(TelephonyManager)context.getSystemService(context.telephony_服务); PhoneCallStateListener customPhoneListener=新的PhoneCallStateListener(上下文); 电话.listen(customPhoneListener,PhoneStateListener.listen\u CALL\u STATE); helper=新的ContactDatabaseHelper(上下文); list=helper.getAllContacts(); 试一试{ incomingNumber=intent.getStringExtra(TelephonyManager.EXTRA\u传入\u编号); 如果(list.size()!=0){ for(int i=0,size=list.size();i
但是,如果用户在电话通话之前不调用应用程序,该怎么办?由于没有状态更改事件-我无法获得正确的数字?听起来您需要在启动时启动应用程序。这与“谷歌钱包”等应用程序的功能类似。当我去商店用手机付款时,我从来不用打开谷歌钱包就能让它工作。但是,当我打开手机并查看我的通知时,我发现“谷歌钱包初始化”非常快,然后它就消失了。现在时间不多,但也许这会有所帮助:@enforcer-99至少在我现有的设备上,呼叫完成后,呼叫日志会更新。确认-在呼叫过程中检查呼叫日志以查找最新的呼叫方会导致前一个呼叫方-而不是当前呼叫方。同意-看起来我可能只需要在启动时启动应用程序,并希望用户不会使用某些节电应用程序杀死它。不过我讨厌这样。这看起来像是一个简单的请求,询问手机“谁是当前的来电者?”我个人不喜欢一直在后台运行的应用程序。请留下一些代码,说明到目前为止您实际尝试了什么。什么不起作用?我的例子似乎可以做到这一点。这难道不意味着需要一直加载应用程序才能拦截这些呼叫状态吗?@enforcer-99我认为你不理解BroadcastReceiver的概念。下面是StackOverflow的描述:“BroadcastReceiver是一个Android组件,用于响应系统范围内的广播公告。”下面是谷歌的链接,您应该仔细阅读。因此。。。您正在响应系统范围的广播,并且您的应用程序没有“一直加载”。这是怎么回事“从Android 3.1开始,如果用户从未启动过相应的应用程序,或者用户通过Android菜单(在管理应用程序中)明确停止应用程序,则Android系统将默认排除所有BroadcastReceiver接收意图。这是一项额外的安全功能,因为用户可以确保只有他启动的应用程序才会收到广播意图。”