Android BroadCastReceiver和android.intent.action.PHONE_STATE事件

时间:2012-06-27 17:21:34

标签: android broadcastreceiver

我通过使用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 个答案:

答案 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