Полноэкранное намерение не запускает действие, но показывает уведомление на android 10

Я пытаюсь запустить действие для broadcastReceiver, используя следующий код

 Intent i = new Intent(context, AlarmNotification.class);
 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // This is at least android 10...

                NotificationManager mgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

                if (mgr.getNotificationChannel(CHANNEL_WHATEVER)==null) {
                    mgr.createNotificationChannel(new NotificationChannel(CHANNEL_WHATEVER,
                            "Whatever", NotificationManager.IMPORTANCE_HIGH));
                }

                mgr.notify(NOTIFY_ID, buildNormal(context, i).build());

            }

private NotificationCompat.Builder buildNormal(Context context, Intent intent) {

    NotificationCompat.Builder b=
            new NotificationCompat.Builder(context, CHANNEL_WHATEVER);

    b.setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_ALL)
            .setSmallIcon(android.R.drawable.ic_lock_idle_alarm)
            .setStyle(new NotificationCompat.BigTextStyle()
                    .bigText(TEXT)
            .setContentText(TEXT)
            .setFullScreenIntent(buildPendingIntent(context, intent), true);

    return(b);

}

private PendingIntent buildPendingIntent(Context context, Intent intent) {

    return(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT));
}

Вначале все работает отлично. Но если я войду в настройки приложения, отключу канал уведомлений CHANNEL_WHATEVER, а затем снова включу. Позже, когда я вызываю NotificationManager.notify, он показывает уведомление в панели уведомлений, но не запускает действие. Если я удалю приложение и переустановлю, оно снова будет работать нормально. Это ошибка Android 10, о которой я должен сообщить, или я могу что-то с этим поделать?


person Simple UX Apps    schedule 10.09.2019    source источник
comment
После того, как вы отключите, а затем включите канал, все ли другие параметры на этом канале такие же, как и в настройках? Ваши симптомы совпадают, если вы теряете IMPORTANCE_HIGH на этом канале из-за цикла отключения / включения.   -  person CommonsWare    schedule 29.09.2019
comment
@CommonsWare Как узнать, потерял ли я IMPORTANCE_HIGH? И если это так, что я могу с этим поделать?   -  person Simple UX Apps    schedule 29.09.2019
comment
И если это так, что я могу с этим поделать? - ничего, кроме, возможно, сообщения об ошибке. Как узнать, потерял ли я IMPORTANCE_HIGH? - программно вы должны иметь возможность посмотреть результат mgr.getNotificationChannel(CHANNEL_WHATEVER), когда он не null. Вызовите getImportance() и запишите, какое значение вы видите.   -  person CommonsWare    schedule 29.09.2019
comment
@CommonsWare Вы правы. Важность изменилась с IMPORTANCE_HIGH на IMPORTANCE_LOW. Я сообщу об этом.   -  person Simple UX Apps    schedule 29.09.2019
comment
@SimpleUXApps Я тоже столкнулся с той же проблемой. Как вам удалось заставить его работать? Отправьте или примите ответ.   -  person Balasubramanian    schedule 08.05.2020


Ответы (4)


В Android 10 нам нужно добавить разрешение для USE_FULL_SCREEN_INTENT

Изменения разрешений для полноэкранных намерений

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

  • Это нормальное разрешение, поэтому система автоматически предоставляет его запрашивающему приложению.

Убедитесь, что вы добавили разрешение в файл манифеста

КОД ОБРАЗЦА

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.nilu.demo">

    <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
person AskNilesh    schedule 30.09.2019
comment
Спасибо за ваш ответ. Я уже использую это разрешение. - person Simple UX Apps; 30.09.2019
comment
Привет, я использую это разрешение, но не могу отображать полноэкранный режим? Пожалуйста помоги - person Tarun; 26.01.2020
comment
После добавления этого разрешения пользователи по-прежнему сообщают, что видят только уведомление - person Dmitrijs; 25.02.2020
comment
@Dmitrijs, вы нашли какое-нибудь решение, потому что сейчас я столкнулся с той же проблемой: / - person Kristiyan Varbanov; 08.04.2020
comment
@Tarun, вы нашли какое-нибудь решение, потому что сейчас у меня такая же проблема: / - person Kristiyan Varbanov; 08.04.2020
comment
@KristiyanVarbanov Привет ... Да, я решил это, но на некоторых телефонах полноэкранный режим появится только потому, что он зависит от операционной системы ... Так что вам нужно добавить резервное уведомление о хедз-апе ... Вы можете попробовать телефоны Redmi, он будет отображать полноэкранный режим - person Tarun; 09.04.2020
comment
Для моих конкретных нужд я добавил получение блокировок - PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE - person Dmitrijs; 11.04.2020
comment
@Dmitrijs Где ты достаешь эти замки? - person Dibzmania; 16.12.2020

Android не позволяет отображать активность, даже если вы используете полноэкранное намерение:

На некоторых платформах пользовательский интерфейс системы может выбрать отображение заголовка уведомления вместо запуска этого намерения, когда пользователь использует устройство.

person greywolf82    schedule 02.10.2019
comment
Так как же нам запустить будильник на Android 10? Насколько я понимаю, полноэкранный режим - единственный выбор. - person Simple UX Apps; 05.10.2019
comment
вы правы, это единственный выбор, но, как я уже сказал, система может решить не отображать активность, а просто показать уведомление - person greywolf82; 05.10.2019
comment
когда экран включен и мое приложение закрыто, система отображает уведомление, после этого я выключаюсь и вижу полноэкранное действие, почему? это ошибка? - person Fereshteh Naji; 22.01.2020
comment
@FereshtehNaji Нет. Например, когда мы получаем звонок, звонок не захватывает весь экран, если мы используем телефон. Когда телефон не используется, вызов происходит в полноэкранном режиме. Это похоже. - person Manish S; 10.06.2021

Просмотрите мою статью о среде о том, как запускать активность в полноэкранном режиме для OS 10. В статье также объясняется, как отображать заголовки уведомлений и обрабатывать нажатия кнопок действий.

https://medium.com/@dcostalloyd90/show-incoming-voip-call-notification-and-open-activity-for-android-os-10-5aada2d4c1e4

person Lloyd Dcosta    schedule 16.03.2020
comment
Работает ли полноэкранный режим, если устройство заблокировано? - person Dibzmania; 27.03.2020
comment
@Bojke См. Мою статью medium.com/@dcostalloyd90/ - person Lloyd Dcosta; 15.04.2020
comment
Не видел в вашей статье ничего, связанного с отображением уведомлений на заблокированном экране - person Dibzmania; 16.12.2020

не уверен, был ли на это дан ответ. В дополнение к ранее упомянутым разрешениям ... Я нашел единственный способ выполнить эту работу - использовать канал NotificationManager.IMPORTANCE_HIGH и уведомление. После установки HIGH, fullScreenIntent будет открыт, если экран выключен. Для последующего изменения канала, похоже, потребуется удалить и переустановить.

Настройте канал уведомлений перед отправкой уведомления как (см. Также):

private static void createNotificationChannel(Context context) {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = **"YOUR CHANNEL"**;
            String description = "YOUR CHANNEL DESCRIPTION";
            int importance = **NotificationManager.IMPORTANCE_HIGH**;
            NotificationChannel channel = new NotificationChannel( "YOUR CHANNEL ID", name, importance);
            channel.setDescription(description);
            // Register the channel with the system; you can't change the importance
            // or other notification behaviors after this
            NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }

Я установил оба намерения, неясно, нужно ли вам устанавливать оба:

createNotificationChannel((context));
...
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, **"YOUR CHANNEL**");
    builder.setContentIntent(pendingIntent);
    builder.setFullScreenIntent(pendingIntent,true);
person user3210655    schedule 12.07.2020