Android 10 Xamarin.Forms MainActivity как полноэкранное намерение для сигнализации - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь исправить существующий Xamarin. Android Приложение на основе форм для работы с Android 10 устройствами.

У нас есть только одно действие в приложении, и мы используем навигацию по формам

. У нас есть фоновая служба, которая может запрашивать основное действие для sh новой страницы и прерывать работу пользователя на устройствах до 10.

Поскольку мы больше не можем прерывать пользователя, выполняющего Android 10, мы решили воспользоваться рекомендованным Google маршрутом . Я нашел этот предыдущий ответ для примера реализации.

В основном код до Android 10 выглядит так:

    // post on ui thread
    Android.App.Application.SynchronizationContext.Post(
   _ =>
   {
       Intent intent = new Intent(this.applicationContext, typeof(MainActivity));
       // intent.AddFlags(ActivityFlags.NoHistory);
       intent.AddFlags(ActivityFlags.FromBackground);
       intent.AddFlags(ActivityFlags.NewTask);
       this.applicationContext.StartActivity(intent);
   },
   null);

Новый код становится:

var builder = new NotificationCompat.Builder(context: this.applicationContext, channelId: channelId);
builder.SetContentTitle(title: notification.Title);
builder.SetContentText(text: notification.Text);
builder.SetSmallIcon(icon: this.resourceManager.GetImage(resourceName: notification.Icon));
builder.SetPriority(pri: notification.Priority);
builder.SetAutoCancel(autoCancel: true);

Intent nextScreen = new Intent(this.applicationContext, typeof(MainActivity));

PendingIntent intent = PendingIntent.GetActivity(
context: this.applicationContext,
requestCode: 0,
intent: nextScreen,
flags: PendingIntentFlags.OneShot);

builder.SetFullScreenIntent(intent: intent, highPriority: true);
this.notificationManager.Notify(id: notification.Id, notification: builder.Build());

Но новый код не работает.

Что происходит, так это то, что уведомление отображается в области уведомлений, а не в полноэкранном режиме.

Я под впечатлением что мне нужно использовать новое Activity.

Могу ли я использовать приложение root activity?

1 Ответ

0 голосов
/ 29 мая 2020

Обновление 1 : этот код работает на устройстве до android 10, независимо от того, заблокировано устройство или нет, приложение на переднем плане или нет.

Это работает частично (не на экран блокировки) с этим новым кодом:

var manager = (Android.App.AlarmManager)this.applicationContext.GetSystemService(Context.AlarmService);
using (var calendar = Calendar.Instance)
{
    calendar.Add(CalendarField.Second, 1);

    Intent fullScreenIntent = new Intent(this.applicationContext, typeof(MainActivity));
    PendingIntent fullScreenPendingIntent = PendingIntent.GetActivity(
         this.applicationContext,
         0,
         fullScreenIntent,
         PendingIntentFlags.OneShot);

         manager.SetExact(AlarmType.RtcWakeup, calendar.TimeInMillis, fullScreenPendingIntent);
}

Обновление 2 : рабочим решением было просто запросить OverlayPermission для приложения и придерживаться старого кода (первый блок вопроса).

При запуске мы вызываем следующий новый метод:

private async Task ManageOverlayPermissionAsync()
{
    IPopupService popupService = Locator.GetSharedInstance<IPopupService>();
    if (BusinessHelper.AndroidMajorVersion >= 10 && !Android.Provider.Settings.CanDrawOverlays(Forms.Context))
    {
        if (await popupService.DisplayAlertAsync(
                BusinessResources.GoToOverlayPermissionTitle,
                BusinessResources.GoToOverlayPermissionMessage,
                BusinessResources.Ok,
                BusinessResources.Cancel))
        {
            var intent = new Intent(Android.Provider.Settings.ActionManageOverlayPermission,
                Android.Net.Uri.Parse("package:" + Forms.Context.PackageName));
            Forms.Context.StartActivity(intent);
        }
    }
}

Затем пользователь направляется к настройкам для включения функции.

...