我通过使用android BroadCastReceiver的以下代码片段来捕获android.intent.action.PHONE_STATE更改事件。我可以成功识别事件并处理来电也可以通过以下代码来完成。
我的要求是识别来自特定号码的呼叫,结束通过代码调用并为该传入事件调用Web服务。
在此处,此代码针对呼叫接收和结束事件运行两次。
我想停止两次调用此方法。我怎么能停止为第二个事件(结束通话)调用该代码片段。如果任何人能帮助我,那将是非常充实的。
if (intent.getAction().equals(
"android.intent.action.PHONE_STATE")) {
Log.i("INFO", "Call Received");
try {
TelephonyManager telephony = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
Bundle bundle = intent.getExtras();
Log.i("Calling database", "Creatinng DataHandler Object");
DatabaseHandler db = new DatabaseHandler(context);
String phoneNumber =db.getContact().getPhoneNumber();
Log.i("Retriving : ", "Retriving .."+ db.getContact().getPhoneNumber());
if ((bundle.getString("incoming_number").equals(phoneNumber))) {
Log.i("Test Call", "This is the test call");
@SuppressWarnings("rawtypes")
Class c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephonyService = (ITelephony) m
.invoke(telephony);
telephonyService = (ITelephony) m.invoke(telephony);
telephonyService.endCall();
// Call the web service and send log details
ServiceClient sc = new ServiceClient();
sc.serviceCall(context);
} else {
Log.i("Normal Call", "This is not the test call");
}
} catch (Exception e) {
Log.i("Exception Occured", "Exception in call code snipet");
}
}
}
答案 0 :(得分:4)
我相信您遇到的问题是电话状态会发生两次变化,一次是电话响铃,然后是电话结束后,电话空闲时。
您只希望此代码运行一次,因此最好的方法是添加电话状态的额外检查以查看它是否响铃,如果电话正在振铃然后结束通话。
这可以通过添加以下检查来实现:
if (intent.getAction().equals(
"android.intent.action.PHONE_STATE")) {
Log.i("INFO", "Call Received");
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
//your code here that starts with try block
}
希望有所帮助
答案 1 :(得分:0)
一旦接收器启动,你可以尝试做这样的事情:
Bundle bundle = nIntent.getExtras();
String phoneNr= bundle.getString("incoming_number");
if(null == phoneNr)
{ // this is outgoing call so bail out
return;
}
答案 2 :(得分:0)
由于安全原因,您无法使用第三方应用程序终止来电。检查“android应用程序开发食谱”页码“164”
答案 3 :(得分:0)
我知道为时已晚,但我找到了一个更好的解决方案。 这通常发生在5.0和5.1。你不能阻止它两次打电话,但你可以通过一般检查来完成你所有的工作。这个解决方案普遍适用于所有操作系统。 这是代码
public void onReceive(Context context, Intent intent) {
Object obj = intent.getExtras().get("subscription");
long subId;
if(obj == null) {
subId = Long.MIN_VALUE; // subscription not in extras
} else {
subId = Long.valueOf(obj.toString()); // subscription is long or int
}
if(subId < Integer.MAX_VALUE) {
// hurray, this is called only once on all operating system versions!
}}
有关详细信息,请查看此link。