如何限制BroadcastReceiver的onReceive仅在来电时调用

3
我有一个应用程序,它监听来电,并根据号码发送短信到该号码。一切正常,在接收到来电时会调用onReceive并发送短信,但是一旦被叫方或呼叫方拒绝了电话,onReceive将再次被调用并且又会发送短信。我该如何限制这个问题,使得只有在接收到来电时才会调用onReceive
以下是我代码的简单版本:
我的BroadcastReceiver import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log;
public class Telephone extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub

        Log.d("onReceive", "Got Call Signal");

    }

}

在清单文件中:

         <receiver android:name="com.example.testbroadcastreceiver.Telephone" >
            <intent-filter android:priority="1000" >
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>

所使用的权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

https://dev59.com/R1fUa4cB1Zd3GeqPFCiv - Ali Imran
2个回答

0

你可以这样逻辑地处理它:

public class ServiceReceiver extends BroadcastReceiver {

  @Override    
  public void onReceive(Context context, Intent intent) {
    MyPhoneStateListener phoneListener=new MyPhoneStateListener();
    TelephonyManager telephony = (TelephonyManager) 
    context.getSystemService(Context.TELEPHONY_SERVICE);
    telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);
  }
}

public class MyPhoneStateListener extends PhoneStateListener {
  public void onCallStateChanged(int state,String incomingNumber){
  switch(state){
    case TelephonyManager.CALL_STATE_IDLE:
      Log.d("DEBUG", "IDLE");
    break;
    case TelephonyManager.CALL_STATE_OFFHOOK:
      Log.d("DEBUG", "OFFHOOK");
    break;
    case TelephonyManager.CALL_STATE_RINGING:
      Log.d("DEBUG", "RINGING");
//place your sms code here
    break;
    }
  } 
}

0

您需要在BroadcastReceiver中注册PhoneStateListener.LISTEN_CALL_STATE以仅接收来电:

public class Telephone extends BroadcastReceiver {

    private Context mContext;
    private Intent mIntent;

    @Override
    public void onReceive(Context context, Intent intent) {
        mContext = context;
        mIntent = intent;
        TelephonyManager tm = (TelephonyManager)              
                 context.getSystemService(Context.TELEPHONY_SERVICE);
        int events = PhoneStateListener.LISTEN_CALL_STATE;
        tm.listen(phoneStateListener, events);
    }

    private final PhoneStateListener phoneStateListener = 
                                                new PhoneStateListener() {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            String callState = "UNKNOWN";
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:

                break;
            case TelephonyManager.CALL_STATE_RINGING:
                                // DO YOUR WORK HERE
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                          if(incomingNumber.length() >0){

                                  // incoming call
                                 // DO YOUR WORK HERE when call is received
                                 // SEND SMS HERE
                            }
                           else{
                                      // outgoing call
                              }
                break;
            }

            super.onCallStateChanged(state, incomingNumber);
        }
    };

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接