Android: отправить локальное уведомление из фонаAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android: отправить локальное уведомление из фона

Сообщение Anonymous »

Я пытаюсь реализовать собственный экран вызова, когда приложение получает определенное push-уведомление.
Когда у меня есть все доступные данные, я пытаюсь вызвать локальное уведомление, пока приложение все еще находится в фоновом режиме.
Примечание: это код .NET для MAUI, но по сути это полная копия Android API, поэтому он должен быть удобочитаемым для Java-программистов.

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

void RegisterNotification(string cid, string title){
.......
var clickIntent = new Intent(context, typeof(MainActivity));
clickIntent.AddFlags(ActivityFlags.SingleTop | ActivityFlags.ClearTop);
clickIntent.PutExtra("field1thatneeded", "abcde");

var pendingIntentFlags = (Build.VERSION.SdkInt >= BuildVersionCodes.S) ? PendingIntentFlags.UpdateCurrent | PendingIntentFlags.Immutable : PendingIntentFlags.UpdateCurrent;
var pendingIntent = PendingIntent.GetActivity(context, activityId, clickIntent, pendingIntentFlags);

.......

var notificationBuilder = new Notification.Builder(this, AppConstants.CallChannelID)
.SetAutoCancel(false)
.SetOngoing(true)
.SetContentTitle("Incoming call")
.SetContentText(title)
.SetContentIntent(pendingIntent)
.SetStyle(Notification.CallStyle.ForIncomingCall(incomingCaller, rejectPendingIntent, answerPendingIntent))
.SetCategory(Notification.CategoryCall);

var notification =notificationBuilder.Build();

#if ANDROID29_0_OR_GREATER
StartForeground(notificationID, notification, Android.Content.PM.ForegroundService.TypePhoneCall);
#else
StartForeground(notificationID, notification    );
#endif
}
Создать уведомление о вызове сразу невозможно, пока не будет прикреплено какое-либо действие, я не могу получить PendingIntent (Попытка вызвать виртуальный метод 'android.os.UserHandle android.content.Context.getUser ()» по ссылке на нулевой объект) или конструктор каналов с необходимыми ресурсами (Попытка вызвать виртуальный метод «android.content.res.Resources android.content.Context.getResources()» для нулевого объекта ссылка / Java.Lang.NullPointerException: попытка вызвать виртуальный метод android.os.UserHandle android.content.Context.getUser() по ссылке на нулевой объект )
Единственное решение, которое я нашел, — это создать Сервис:

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

[Service(ForegroundServiceType = Android.Content.PM.ForegroundService.TypePhoneCall, Exported = false)] //this attribute fills up AndroidManifest

internal class DroidCallService: Service
{
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
if (intent.Action == "START_SERVICE")
{
var callID = intent.GetStringExtra("call_id");
var name = intent.GetStringExtra("call_title");
RegisterNotification(callID, name);
}
else if (intent.Action == "STOP_SERVICE")
{
StopForeground(StopForegroundFlags.Remove);
StopSelfResult(startId);
}

return StartCommandResult.NotSticky;
}
}
Когда приложение выгружено, все это работает нормально на Android 11 и более ранних версиях, но поскольку действуют новые ограничения на службы переднего плана, я получаю сообщение об ошибке при запуске службы:

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

            Intent startService = new Intent(ctx, typeof(DroidCallService));
startService.SetAction("START_SERVICE");

startService.PutExtra("call_id", callID);
startService.PutExtra("call_title", name);

#if ANDROID26_0_OR_GREATER
ctx.StartForegroundService(startService); // ERROR!
#else
ctx.StartService(startService);
#endif
Android.App.ForegroundServiceStartNotAllowedException:
startForegroundService() не разрешен из-за mAllowStartForeground
false
< /blockquote>
и

Android.App.BackgroundServiceStartNotAllowedException: невозможно
запустить службу Intent { act=START_SERVICEcmp=com.company.app/crc646332b1bcddc0e22c.DroidCallService
(есть дополнительные функции) }: приложение работает в фоновом режиме

Я видел несколько рекомендации, например, попросить пользователя пропустить оптимизацию батареи, использовать будильник или календарь и т. д., но все это похоже на «причудливые» решения.
Задача проста: фоновому экземпляру необходимо запустить службу приоритетного плана. Как правильно это сделать и как?

Подробнее здесь: https://stackoverflow.com/questions/789 ... background
Ответить

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

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

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

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

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