Я пытаюсь получать события изменения состояния вызова (входящие, исходящие). В эмуляторе он действительно хорошо работает, но в устройстве работает только в запущенном состоянии приложения. Я пытался в Sumsung S6 , и если я удаляю последние приложения (смахивание), широковещательный приемник вообще не работает, как я могу заставить это работать? Спасибо за вашу помощь.
<receiver
android:name=".utils.CallReceiver"
android:directBootAware="true"
android:enabled="true"
android:exported="true"
android:label="CallReceiver">
<intent-filter android:priority="101">
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
<!-- For pre-N devices -->
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
<intent-filter android:priority="100">
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
Это код приемника вещания
@Override
public void onReceive(Context context, Intent intent) {
Log.e("onCallStateChanged","intent state Detected");
if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {
savedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER");
}else if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ContextCompat.startForegroundService(context,new Intent(context, AppsLoggingService.class));
Log.e("Broadcast","Oreo Boot_completed");
} else {
context.startService(new Intent(context, AppsLoggingService.class));
Log.e("Broadcast","Boot_completed");
}
}else if (intent.getAction().equals("android.intent.action.PHONE_STATE")){
String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
int state = 0;
if(stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)){
state = TelephonyManager.CALL_STATE_IDLE;
}
else if(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
state = TelephonyManager.CALL_STATE_OFFHOOK;
}
else if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){
state = TelephonyManager.CALL_STATE_RINGING;
}
onCallStateChanged(context, state, number);
}
}
Это стартовый код приемника вещания из действия
@Override
protected void onResume() {
super.onResume();
registerReceiver(call_boot_broadcast,intentFilter);
}
@Override
protected void onPause() {
unregisterReceiver(call_boot_broadcast);
super.onPause();
}
Это начальная часть приемника вещания из услуги
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onTaskRemoved(intent);
// registerScreenOffReceiver();
m_ScreenOffReceiver= new CallReceiver();
intentFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
// Add network connectivity change action.
intentFilter.addAction("android.intent.action.BOOT_COMPLETED");
intentFilter.addAction("android.intent.action.NEW_OUTGOING_CALL");
intentFilter.addAction("android.intent.action.PHONE_STATE");
// Set broadcast receiver priority.
intentFilter.setPriority(100);
this.registerReceiver(m_ScreenOffReceiver, intentFilter);
Log.e("Apploging","Apploggingservice started");
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("Apploging","Apploggingservice destroyed");
unregisterReceiver(m_ScreenOffReceiver);
}