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_CALL
或 PHONE_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
接收器也会通过适当的通知启动此前台服务...
- 在 android 4.2 上打印出局号码,在 oreo 中它打印出局号码空白..
- 在某些更改上,Oreo 打印传出号码但在状态为
EXTRA_STATE_RINGING
时停止接收传入号码
- 有时它会打印两次去电号码
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
Yes there are questions already asked on this topic on
Stack-Overflow;
Explored many questions, Even i am aware ofCALL_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_CALL
或 PHONE_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
接收器也会通过适当的通知启动此前台服务...
- 在 android 4.2 上打印出局号码,在 oreo 中它打印出局号码空白..
- 在某些更改上,Oreo 打印传出号码但在状态为
EXTRA_STATE_RINGING
时停止接收传入号码
- 有时它会打印两次去电号码
I want incoming phone number while
EXTRA_STATE_RINGING
I wantNEW_OUTGOING_CALL
outgoing phone number only once, and when the STATEEXTRA_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 onlyManifest.permission.READ_PHONE_STATE
runtime permission BUT Above OreoManifest.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