我想构建一个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