ForegroundService запущен, но событие класса onScreenCall никогда не вызывалосьJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 ForegroundService запущен, но событие класса onScreenCall никогда не вызывалось

Сообщение Anonymous »

Я пытаюсь написать свое первое тестовое приложение, поэтому у меня нет всех строк программирования для Android/Java, взятых из C#/PHP и других. Я хочу создать службу проверки, которая блокирует входящие вызовы на основе определенных критериев. Я знаю, что мог бы использовать множество других сервисов, но моя цель – не получить результат, а написать код для его достижения.
Первым шагом было написание build.gradle.kts большая часть, если не все, уже была там iirc, использованная конфигурация включает следующее:

Код: Выделить всё

minSdk = 26
targetSdk = 34
Я читал, что мне нужно иметь minSdk = 26 для этого типа сервиса. Затем файл манифеста, где я указываю разрешения, сервис и активность: Затем я настроил запуск службы после загрузки телефона:

Код: Выделить всё

public class BootCompletedReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
Intent serviceIntent = new Intent(context, ScreeningService.class);
context.startForegroundService(serviceIntent);
}
}
}
Однако в целях отладки я подумал, что было бы проще, если бы я мог запускать службу без загрузки устройства, поэтому я поместил это в MainActivity.java, чтобы запускать службу при каждом запуске приложения:

Код: Выделить всё

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);

//Intent serviceIntent = new Intent(MainActivity.this, ScreeningService.class);
Intent serviceIntent = new Intent(getApplicationContext(), ScreeningService.class);
startForegroundService(serviceIntent);

ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) ->  {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
}
Пока это имеет смысл, тогда в моем классе ScreeningService. я выполняю задачу проверки:

Код: Выделить всё

public class ScreeningService extends CallScreeningService  {

private static final String CHANNEL_ID = "call_screening_channel";
private String karen = "123456"; // omissis in StackOverflow, it has my other phone number with itnernational prefix

@Override
public void onCreate() {
super.onCreate();
createNotificationChannel();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);

Notification notification = createNotification();
startForeground(1, notification);

return START_STICKY;
}

private Notification createNotification() {
Context context = this;

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, CHANNEL_ID);
notificationBuilder.setContentTitle("Call Screening Alert");
notificationBuilder.setContentText("Call from Blacklisted Number");
notificationBuilder.setSmallIcon(R.drawable.app_icon);
notificationBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText("Call from a blacklisted number"));
notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH);
return notificationBuilder.build();
}

private void createNotificationChannel() {
//if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = "Call Screening Channel";
String description = "Channel for call screening notifications";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
channel.setDescription(description);

NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
//}
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onScreenCall(Call.Details callDetails) {
String callingNumber = callDetails.getHandle().getSchemeSpecificPart();
Log.d("CallScreeningService", "onScreenCall called with number: " + callingNumber);
if (callingNumber != null && callingNumber.equals(karen)) {
// Decline the call if it's from your black list
CallResponse callResponse = new CallResponse.Builder()
.setDisallowCall(true)
.setRejectCall(true)
.setSkipCallLog(true)
.setSkipNotification(true)
.build();
respondToCall(callDetails, callResponse);
} else {
// Allow the call otherwise
CallResponse callResponse = new CallResponse.Builder()
.setDisallowCall(false)
.setRejectCall(false)
.build();
respondToCall(callDetails, callResponse);
}
}
}
Это выглядит очень тривиально, служба запущена правильно, теперь, поскольку у меня нет хорошо продуманной среды разработки для мобильных телефонов, у меня есть только RealMe, а на другом телефоне ее нет. встретил minSdk, поэтому я тестирую на своем, он подключен к Wi-Fi, приложение развертывается на моем телефоне и запускается. Поскольку этот телефон использует EMUI, возникает первая проблема: Я не вижу уведомления в правом верхнем углу, но я думаю, что это связано с тем, что EMUI включает в себя чистую функциональность Android, однако расширяет шторку. Я нахожу рекламное меню из трех точек, оттуда я вижу всегда активные приложения, не уверен, включает ли оно их в качестве услуги, логотип приложения является общим, а не значком, который я выбрал для уведомления, поэтому это вызывает некоторые сомнения, однако, следуя debug Я не вижу ошибок при запуске службы переднего плана.
Вторая ошибка, которая может быть связана с предыдущей: Я не могу запустить onScreenCall Я добавил запись в журнал и точки останова, но он никогда не выполняет проверку входящих вызовов, поэтому, вероятно, служба на самом деле не запущена, но приложение по какой-то причине всегда находится в активном режиме. В целях тестирования я установил номер для блокировки, но логика, которую я бы реализовал, другая, однако, если я не смогу пройти этот тривиальный шаг, бессмысленно писать более сложный дизайн.
Я предполагаю, что мне понадобится подходящий телефон на чистом Android для тестирования, а затем адаптировать свой код к другим устройствам, например, к моему с оболочкой EMUI, и кто знает, какие еще оболочки существуют для тестирования. Несмотря на это, я считаю, что телефоны REalme в некоторой степени популярны, поэтому лучше, если я исправлю это с самого начала.


Подробнее здесь: https://stackoverflow.com/questions/787 ... er-invoked
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • ForegroundService запущен, но событие класса onScreenCall никогда не вызывалось
    Anonymous » » в форуме Android
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • ForegroundService: onScreenCall не вызывается
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • ForegroundService: onScreenCall не вызывается
    Anonymous » » в форуме Android
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Метод onScreenCall() в CallScreeningService не вызывается, я хочу, чтобы эта функция получала сведения о вызове
    Anonymous » » в форуме Android
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Android ForegroundService на нескольких экранах Jetpack Compose
    Anonymous » » в форуме Android
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»