1

我通过使用以下代码片段和 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");
        }
    }

}

4

4 回答 4

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
}

希望有帮助

于 2013-05-04T01:19:33.700 回答
0

由于 android 安全原因,您无法使用第三方应用程序终止来电。签入“android 应用程序开发食谱”页码“164”

于 2014-04-02T02:53:27.507 回答
0

接收器启动后,您可以尝试执行以下操作:

    Bundle bundle = nIntent.getExtras();
    String phoneNr= bundle.getString("incoming_number");

    if(null == phoneNr)
    {   // this is outgoing call so bail out
        return;
    }
于 2012-10-05T11:31:41.613 回答
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!
      }}

有关更多信息,请查看此链接

于 2017-04-05T12:12:27.610 回答