PHONE_STATE 和 NEW_OUTGOING_CALL 接收器混淆行为

PHONE_STATE and NEW_OUTGOING_CALL receiver confusing behaviour

Yes there are questions already asked on this topic on Stack-Overflow; Explored many questions, Even i am aware of CALL_STATES, But this is a class apart from those all, I have tried on my own from two days, finally i am decided to ask experts here...


这是我的广播接收器:

private BroadcastReceiver mCallBroadcastReceiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.d("RECEIVER X: ", "IS UP AGAIN....");
        String action = intent.getAction();

        if (action.equalsIgnoreCase("android.intent.action.NEW_OUTGOING_CALL"))
        {
            // Outgoing call
            String OutGoingPhoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            Log.d("RECEIVER X: ", "Outgoing Number - "+OutGoingPhoneNumber);
        }
        else if(action.equalsIgnoreCase("android.intent.action.PHONE_STATE"))
        {
            // Incoming call
            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
            String InComingPhoneNumber;

            if(state == null)
            {
                InComingPhoneNumber = "UNKNOWN";
            }
            else if (state.equals(TelephonyManager.EXTRA_STATE_RINGING))
            {
                InComingPhoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                Log.d("RECEIVER X: ","Incoming number - "+InComingPhoneNumber);
            }
        }
    }
};

从服务的 onCreate 开始,我已经注册了接收器,只要系统触发 NEW_OUTGOING_CALLPHONE_STATE 事件,它就会工作并被调用。

IntentFilter CallFilter = new IntentFilter();
CallFilter.addAction("android.intent.action.PHONE_STATE");
CallFilter.addAction("android.intent.action.NEW_OUTGOING_CALL");
this.registerReceiver(mCallBroadcastReceiver, CallFilter);

我的 onStartCommand 是:

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    Log.d("WatchMan : ", "\nmCallBroadcastReceiver Listening....");
    //return super.onStartCommand(intent, flags, startId);
    return START_STICKY;
}

并从 onDestroy 取消注册:

@Override
public void onDestroy()
{
    this.unregisterReceiver(mCallBroadcastReceiver);
    Log.d("WatchMan : ", "\nDestroyed....");
    Log.d("WatchMan : ", "\nWill be created again....");
}

它是已注册的接收器,即使在重新启动时注册器也能正常工作,因为 BOOT_COMPLETED 接收器也会通过适当的通知启动此前台服务...

  1. 在 android 4.2 上打印出局号码,在 oreo 中它打印出局号码空白..
  2. 在某些更改上,Oreo 打印传出号码但在状态为 EXTRA_STATE_RINGING
  3. 时停止接收传入号码
  4. 有时它会打印两次去电号码

I want incoming phone number while EXTRA_STATE_RINGING I want NEW_OUTGOING_CALL outgoing phone number only once, and when the STATE EXTRA_STATE_IDLE means call is ended i want to start a new service. also it should work on Oreo and in android 4.2 Any help will be appreciated and thank you in advance.

Above Marshmallow it requires only Manifest.permission.READ_PHONE_STATE runtime permission BUT Above Oreo Manifest.permission.PROCESS_OUTGOING_CALLS also required in runtime.

代码现在可以运行了:

private BroadcastReceiver mCallBroadcastReceiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.d("RECEIVER X: ", "IS UP AGAIN....");
        String action = intent.getAction();
        String PhoneNumber = "UNKNOWN";

        if (action.equalsIgnoreCase("android.intent.action.NEW_OUTGOING_CALL"))
        {
            PhoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            Log.d("RECEIVER X: ", "Outgoing number : " + PhoneNumber);
            Intent InsertDb = new Intent(context, CatchNumbers.class);
            InsertDb.putExtra("TYPE", "OUTGOING");
            InsertDb.putExtra("PHONENUMBER", PhoneNumber);
            startService(InsertDb);
        }
        if (action.equalsIgnoreCase("android.intent.action.PHONE_STATE"))
        {
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING))
            {
                PhoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                Log.d("RECEIVER X: ", "Incoming number : " + PhoneNumber);
                Intent InsertDb = new Intent(context, CatchNumbers.class);
                InsertDb.putExtra("TYPE", "INCOMING");
                InsertDb.putExtra("PHONENUMBER", PhoneNumber);
                startService(InsertDb);
            }
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE))
            {
                Log.d("RECEIVER X: ", "CALL ENDED... ");
                // start service to send SMS now from Table
                Intent InsertDb = new Intent(context, CatchNumbers.class);
                InsertDb.putExtra("TYPE", "CALLEND");
                startService(InsertDb);
            }
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK))
            {
                Log.d("RECEIVER X: ", "ACTIVE OUTGOING CALL : ");
            }
        }
    }
};

Hope it helps someone... like me