2016-09-18 18 views
19

Chcę wyświetlać stale małą ikonę w numerze status bar, bez pokazywania samego powiadomienia na tacy w systemie notification.Pokaż tylko małą ikonę na pasku stanu bez powiadomienia o wyświetleniu

Próbowałem użyć niestandardowego layout i ustawić widoczność elementu głównego na View.GONE lub View.INVISIBLE, ale dla obu system ignoruje to.

Próbowałem również ustawić wysokość elementu głównego, ale system również to ignoruje.

Oto mój kod:

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"/> 

I kod na wyświetlaczu 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()); 

Jestem świadomy, że dla osiągnięcia mój cel będę nie wymaga udokumentowanego rozwiązania. Jestem również świadomy, że wytyczne UX zdecydowanie zalecają, aby tego nie robić. Nie ma sensu pisać mi tego jako odpowiedzi.

+0

Chcesz ustawić ta mała ikona, gdy aplikacja uruchamia się i utrzymuje ją stale? –

+0

Afaik czego szukasz, nie jest możliwe bez stałego powiadomienia w obszarze powiadomień. Jest to możliwe tylko w przypadku niestandardowego systemu Android, więc nie będzie to dla ciebie przydatne – Tazz

+0

@mwisnicki tak, dokładnie. Działa już świetnie. Po prostu szukam sposobu na pozbycie się powiadomienia na tacy i wyświetlenie tylko małej ikony. – yshahak

Odpowiedz

1

Możesz to zrobić, używając InputMethodService.showStatusIcon(). Proponuję jednak wyświetlić normalne powiadomienie i wyjaśnić użytkownikowi, co robi teraz Twoja aplikacja.

+1

Mam powód, dla którego nie chcę powiadomienia na tacy, w zasadzie dlatego, że mała ikona miała pozostać tam 24 godziny na dobę (na przykład ikona baterii systemu). – yshahak

+0

Czy możesz wyjaśnić, jak można to zrobić za pomocą 'InputMethodService.showStatusIcon()'? Jak wyraźnie nie mam nic do roboty w tej chwili z 'InputMethodService' – yshahak

9

To nie jest dobry pomysł, aby pokazać ikonę bez pokazać mu wszelkie związane z treścią zawiadomienia, za docs deweloperskich,

Zgłoszenie pasek stanu wymaga wszystkie z poniższych kryteriów:

  • ikona dla statusu pasek (który Cię interesuje)
  • Tytuł i rozwinięta wiadomość dla rozwiniętego widoku (chyba że zdefiniujesz niestandardowy rozszerzony widok).
  • PendingIntent, uruchamiany po kliknięciu powiadomienia, aby wyświetlić powiązane informacje.

Więc jeśli nie chcesz zrujnować User Experience to jest to godne polecenia do wytycznych UX

logicznie: Istnieją dwie części paska stanu - użytkownik (powiadomień) oraz system (inne) . Jeśli system pozwala na umieszczenie czegoś w części systemowej - pojawi się tak wiele bezużytecznych ikon (opublikowanych przez inne aplikacje) i nie będzie spójności, a to może przerwać całe doświadczenie użytkowania.

Znaleziono odpowiedź, która zapewnia dostęp do domyślnej ikony paska stanu Alarmu, to here. Po uruchomieniu Root na telefonie komórkowym możesz to zrobić. Istnieje kilka sztuczek na youtube, niektóre odpowiedzi na ten sam temat sugerują, aby wyświetlać ikonę za pomocą powiadomienia, ale zostaw pusty tekst powiadomienia, aby użytkownik zobaczył tylko ikonę, , ale znowu nie jest to sposób na to, aby .

This is code dla implementacji paska stanu w Systemie, w którym opisane są ikony lewy i prawy (tj. Ikony systemu), z którego można uzyskać dostęp. Odpowiedź opisująca to: here.

+0

Dziękuję, jestem świadomy tego, co napisałeś o konieczności przestrzegania wytycznych UX.Nie szukałbym rozwiązania, gdybym nie miał do tego dobrego powodu. Pracuję nad tą aplikacją przez ponad 6 miesięcy. W każdym razie rozwiązanie, które polega na wykorzenianiu telefonu, nie jest tym, czego szukam. Również nie jest rozwiązaniem umieszczania pustego powiadomienia na tacy. – yshahak

+0

tak wiem, więc dodałem w ostatnim zdaniu "ale znowu nie jest to sposób". myślę, że powinno być pogrubione .. :) @yshahak – TapanHP

+0

Jeszcze raz dziękuję. Uważnie przeczytałem pytanie i odpowiedź, do której się odnosiłeś, i chociaż jest to interesujące, to nie jest to kierunek, którego potrzebuję, ponieważ moja aplikacja nie jest "aplikacją systemową" i nie mam dostępu do kodu źródłowego. – yshahak

6

Proponuję nie używać do zwykłej aplikacji Google Play. Istnieje kilka powodów:

  1. Jeśli znajdziesz błąd, który może pomóc, aby pokazać niewidzialne powiadomienia Wydaje nic. Błąd może działać tylko w urządzeniu z konkretną wersją systemu Android. Pamiętaj: jest to bardzo trudne do skonfigurowania, aby Twój normalny kod był prawidłowo uruchamiany na większości urządzeń korzystających z otwartego interfejsu API. Ukryty interfejs API nie działa na wszystkich urządzeniach.

    1. Nie ma takiego zachowania w kodzie źródłowym: 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. Nic nie można znaleźć w takim zachowaniu.

    2. Aby przewidzieć zachowanie, należy użyć klas * Compat klas Androida. Oznacza to, że do powiadomienia używaj tylko klasy NotificationCompat! Tylko z otoką aplikacja może wyświetlać powiadomienia.

    3. To bardzo brzydki UI/UX.

    4. Przepływ pracy powiadomień dramatycznie zależy od wersji Androida.

0

można użyć RemoteViews ukryć tytuł i tekst

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> 

w główną działalność:

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);