Подтвердить что ты не робот

Показывать только небольшую иконку в строке состояния без уведомления

Я хочу показать постоянную маленькую иконку в status bar, не отображая самого уведомления в лотке notification системы.

Я попытался использовать пользовательский layout и установить видимость корневого элемента на View.GONE или View.INVISIBLE, но для обоих система игнорирует его.

Я также пытался установить высоту корневого элемента, но система также игнорирует это.

Вот мой код:

R.layout.custom_notification:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/custom_notification"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:background="@drawable/notif_background"
    android:orientation="horizontal"
    android:baselineAligned="false"/>

И код для отображения notification:

 NotificationManager nm = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ctx);
 mBuilder
         .setSmallIcon(drawableId)
         .setAutoCancel(false)
         .setOngoing(true)
         .setPriority(Notification.PRIORITY_MAX);
 Intent resultIntent = new Intent(ctx, SettingsActivity.class);
 PendingIntent resultPendingIntent = PendingIntent.getActivity(ctx, 0, resultIntent, 0);
 mBuilder.setContentIntent(resultPendingIntent);
 int layout =  R.layout.custom_notification ;
 RemoteViews contentView = new RemoteViews(ctx.getPackageName(), layout);
 contentView.setViewVisibility(R.id.custom_notification, View.INVISIBLE);
 mBuilder.setContent(contentView);
 nm.notify(NOTIFICATION_ID, mBuilder.build());

Я хорошо знаю, что для достижения моей цели мне не нужно документированное решение. И я также знаю, что рекомендации UX настоятельно рекомендуют не делать этого. Поэтому нет смысла писать мне это как ответ.

4b9b3361

Ответ 1

Не рекомендуется показывать значок, не указывая на него какое-либо связанное уведомление. Согласно документам разработчиков

Уведомление о статусной строке требует всего:

  • Значок для строки состояния (который вас интересует)
  • Заголовок и расширенное сообщение для расширенного представления (если вы не определяете пользовательское расширенное представление)
  • PendingIntent, который будет запущен при нажатии на уведомление, чтобы показать соответствующую информацию.

Итак, если вы не хотите разрушать пользовательский опыт, то настоятельно рекомендуется следовать рекомендациям UX,

логически: есть две части строки состояния - пользователь (уведомления) и система (другие). Если система позволяет поместить что-то в системную часть - будет много бесполезных значков (отправлено другими приложениями), и не будет никакой согласованности, и это может нарушить весь опыт использования.

Найден ответ, который предоставляет вам способ доступа к значку строки состояния по умолчанию для Alarm, который здесь. После Корни вашего мобильного телефона вы можете это сделать. Некоторые трюки на youtube делают это. Некоторые ответы на эту же тему предлагают показать значок с помощью Notification, но поместить Notification Text пустым, чтобы пользователь видел только значок, , но опять же это не путь.

Это код для реализации строки состояния в системе, где описаны левая и правая значки (например, системные значки), можете ли вы получить некоторый результат оттуда. Ответ, который описывает его здесь.

Ответ 2

Я бы посоветовал не использовать для обычного приложения Google Play. Существует несколько причин:

  • Если вы обнаружите ошибку, которая может помочь показать невидимое уведомление, это ничего не значит. Ошибка может работать только на частичном устройстве с конкретной версией Android. Помните: очень сложно правильно настроить ваш обычный код на большинстве устройств с использованием открытого API. Скрытый API не работает на всех устройствах.

    1. В исходном коде такого поведения нет: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/NotificationManager.java#NotificationManager.notify%28int%2Candroid.app.Notification%29. Вы не можете найти ничего с таким поведением.

    2. Для предсказуемого поведения используйте классы * Совместимость для Android. То есть для использования уведомлений используется только класс NotificationCompat! Только с оберткой может помочь вашему приложению показывать уведомления.

    3. Это очень уродливый UI/UX.

    4. Рабочий процесс уведомлений сильно зависит от версии Android.

Ответ 3

Вы можете сделать это, используя InputMethodService.showStatusIcon(). Но я предлагаю вам отобразить нормальное уведомление и объяснить пользователю, что ваше приложение делает прямо сейчас.

Ответ 4

вы можете использовать RemoteViews, чтобы скрыть заголовок и текст

R.id.notification_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="10dp"
        android:layout_marginLeft="7dp"
        android:src="@drawable/icon_battery" />
</RelativeLayout>

в MainActivity:

RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notification_layout);
Context application = getApplicationContext();

Intent resultIntent = new Intent(application, MainActivity.class);
resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent resultPendingIntent = PendingIntent.getActivity(application, 0, resultIntent, 0);
NotificationManager nmgr = (NotificationManager) application.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(application)
            .setSmallIcon(R.drawable.icon_battery);

mBuilder.setContent(contentView);
Notification mNotification = mBuilder.build();

//  mNotification.flags |= FLAG_NO_CLEAR;
nmgr.notify(0, mNotification);

Ответ 5

Поздно, но может быть полезно для других.

В моем случае это так просто, просто используйте высоту 0dp в вашем основном макете, например

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout" android:layout_width="fill_parent" android:layout_height="0dp">

wrap_content не будет работать здесь.