2011-05-29 30 views
24

Po prostu eksperymentuję z rozwojem Androida, a kilka dni temu natknąłem się na tę aplikację o nazwie "Go SMS Pro", która między innymi może konfigurować powiadomienia w różnych kolorach (niebieski, zielony , pomarańczowy, różowy i jasnoniebieski). Tak więc próbowałem to zrobić samodzielnie w mojej własnej aplikacji, jednak nie mogę zmienić koloru ani migotania wewnętrznego diody LED. Obecnie używam tego kodu:Zmiana koloru LED dla powiadomień

public class MainActivity extends Activity { 
    static final int NOTIFICATION_ID = 1; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(buttonOnClick); 
    } 

    public OnClickListener buttonOnClick = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     String ns = Context.NOTIFICATION_SERVICE; 
     NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); 

     Notification notification = new Notification(R.drawable.icon, "Hello", System.currentTimeMillis()); 
     notification.flags = Notification.FLAG_SHOW_LIGHTS | Notification.FLAG_AUTO_CANCEL; 
     notification.ledARGB = Color.BLUE; 
     notification.ledOnMS = 1000; 
     notification.ledOffMS = 300; 

     Context context = getApplicationContext(); 
     CharSequence contentTitle = "My notification"; 
     CharSequence contentText = "Hello World!"; 
     Intent notificationIntent = new Intent(MainActivity.this, MainActivity.class); 
     PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.this, 0, notificationIntent, 0); 

     notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); 

     mNotificationManager.notify(NOTIFICATION_ID, notification); 
    } 
    }; 
} 

Ale jak powiedziałem, to nie działa tak, jak chcę; zamiast tego po prostu miga na zielono z domyślnym opóźnieniem, a nie tym, który ustawiłem w moim kodzie.

Czy ktoś może zobaczyć, co jest nie tak z moim kodem, lub wiem, czy muszę zrobić coś innego, aby to osiągnąć?

Odpowiedz

2

Spróbuj użyć koloru hex, to wartość alfa i ustawić domyślne 0:

notification.defaults = 0; 
notification.ledARGB = 0xff0000ff; 

Ponadto, interfejs powiadomienie mówi tak:

public int ledARGB 
Since: API Level 1 

The color of the led. The hardware will do its best approximation. 

Jestem zakładając sprzęt ma wszystkie kolory, ale może nie.

+0

Próbowałem zarówno ustawienie 'notification.defaults' na' 0' i 'notification.ledARGB' na wartość szesnastkową (mimo że' Color.BLUE' ma stałą wartość '0xff0000ff' mimo to), ale żadne z tych rzeczy działają. Jestem również świadomy, że sprzęt może zrobić przybliżenie, ale wiem na pewno, że powinien przynajmniej być w stanie zrobić kolory: zielony, niebieski, pomarańczowy i różowy. – Frxstrem

+0

Dość dziwne. Czy aplikacja ** Go SMS Pro ** skutecznie zmienia kolory w telefonie? Wiem, że niektóre telefony mają problemy z kolorami powiadomień LED. – Femi

+0

Tak, przynajmniej do kolorów ustawionych w tej aplikacji (jak wspomniałem, zielony, niebieski, pomarańczowy i różowy). Próbowałem jednak innych aplikacji, które mają zmienić kolor diody LED, które nie działają, i po prostu pokazują zielone, migające światełko, niezależnie od wybranego koloru, tak jak to robi moja aplikacja. – Frxstrem

10

Diody LED to dość niestandardowa funkcja w telefonach z Androidem. Jeśli będziesz w nich polegał, stracisz dobry kawałek bazy użytkowników (rozważmy na przykład telefony SGS, które nawet nie mają diod LED).

To powiedziawszy, id pole int ledARGB nie było użyteczne, może zajść potrzeba sprawdzenia połączenia JNI z tego pliku APK. Domyślam się, że będzie miał różne metody w zależności od urządzenia, na którym działa.

+0

Chcę zaimplementować to https://stackoverflow.com/questions/25479517/change-notification-led-color-if-it-is-previouslyset-by-tre-creator-application Proszę mi wskazać, jak to zrobić . –

1

Obsługa kolorów LED jest naprawdę niesprawna. Spróbuj odłączyć kabel USB i upewnij się, że żadna inna aplikacja nie próbuje zmodyfikować diody LED w tym samym czasie. Wyłącz także ekran.

+0

Cóż, jestem przekonany, że ani USB, ani inne aplikacje, ani ekran nie powodują tego, ponieważ dostaję migające światło, chociaż nie jest to częstotliwość migania ani kolor, o który proszę. Myślę, że jest to raczej coś w samym kodzie, ponieważ mój własny kod i wiele aplikacji, które znajduję na rynku itp., Mają problemy, które opisuję, podczas gdy kilka innych aplikacji nie działa i faktycznie działa. – Frxstrem

+0

Czy to Nexus One działa na platformie 2.3.4 lub coś jeszcze? –

12

Można użyć tego kodu:

private static final int LED_NOTIFICATION_ID= 0; //arbitrary constant 

private void RedFlashLight() { 
    NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    Notification notif = new Notification(); 
    notif.ledARGB = 0xFFff0000; 
    notif.flags = Notification.FLAG_SHOW_LIGHTS; 
    notif.ledOnMS = 100; 
    notif.ledOffMS = 100; 
    nm.notify(LED_NOTIFICATION_ID, notif); 
} 

Zamiast wartości ARGB jako przykład koncert, można użyć int właściwość wewnątrz android.graphics.Color klasie uzyskać kolor jak również (np Color.WHITE)

+0

Poza pewnymi drobnymi różnicami, to w zasadzie ** to ** kod, którego używam ... – Frxstrem

+0

Wiem, napisałem go do ciebie, abyś mógł wprowadzić tę różnicę w swoim kodzie. Może to działa. Jak to działa na moim urządzeniu – Stuti

+3

Cóż, to nie działa, już próbowałem (zanim zadałem pytanie) ... A także, ponieważ diody LED działają inaczej na różnych urządzeniach i prawdopodobnie nie testowałem tego na tym samym urządzenie tak jak ja, nie jest szczególnie pomocne, jeśli działa na twoim urządzeniu - ten kod prawdopodobnie działa na wielu urządzeniach, ale nie na moim - to jest problem. – Frxstrem

11

Czy spróbuj: .setLights (Color.BLUE, 500, 500)?

działa dobrze na S3, N5, N4, Nexus One Too ..

+0

Tylko dla informacji jest przestarzałe od API poziom 26 zobacz moją odpowiedź poniżej: https://stackoverflow.com/questions/6169291/changing-led-color-for-notifications/45793450#45793450 – pcj

1

rzucić okiem na źródła poniżej.

NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(ctx) 
         .setPriority(Notification.PRIORITY_HIGH) 
         .setSmallIcon(getNotificationIcon()) 
         .setColor(0xff493C7C) 
         .setContentTitle(ctx.getString(R.string.app_name)) 
         .setContentText(msg) 
         .setDefaults(Notification.DEFAULT_SOUND) 
         .setLights(0xff493C7C, 1000, 1000) 
         .setStyle(new NotificationCompat.BigTextStyle().bigText(styledMsg)); 
0

Próbowałem mój kod poniżej, a światło działa dobrze dla mnie. Moja komórka to Nexus 6P:

mBuilder.setContentTitle("APP_NAME") 
       .setContentText(msg) 
       .setContentIntent(PendingIntent.getActivity(mCtxt, UUID.randomUUID().hashCode(), new Intent(mCtxt, ReceivePushActivity.class), Notification.FLAG_AUTO_CANCEL)) 
       .setWhen(System.currentTimeMillis()) 
       .setPriority(Notification.PRIORITY_DEFAULT) 
       .setAutoCancel(true) 
       //.setDefaults(Notification.DEFAULT_ALL) 
       .setVibrate(new long[] {0, 1000, 200,1000 }) 
       .setLights(Color.MAGENTA, 500, 500) 
       .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) 
       .setSmallIcon(R.mipmap.notify_logo); 

     Notification ntf = mBuilder.build(); 
//  ntf.flags = Notification.DEFAULT_ALL; 
//  ntf.flags = Notification.FLAG_ONLY_ALERT_ONCE; 
//  ntf.flags = Notification.FLAG_AUTO_CANCEL; 

     mNotificationManager.notify(notifyId, ntf); 

Znaczenie, usuń ustawienia "DEFAULT_ALL".

2

FLAG_SHOW_LIGHTS i Notification.Builder.setLights(int,int,int); są przestarzałe, ponieważ Android O (poziom API 26) Jeśli zamierzasz korzystać z tej funkcji w poziomie API 26 lub większe mają przyjrzeć NotificationChannel

Example:

NotificationChannel mChannel = new NotificationChannel(id, name, importance); 
..... 
..... 
mChannel.enableLights(true); 
// Sets the notification light color for notifications posted to this 
// channel, if the device supports this feature. 
mChannel.setLightColor(Color.RED); 

ale w tym nowa implementacja Możesz nie mieć kontroli nad LED on milli-seconds & LED off milli-seconds będzie to zależne od sprzętu.

+0

Czy nadal możesz używać starej metody, jeśli celujesz na niższy poziom API? – Michael

+0

Ponieważ jest wprowadzony od wersji Androida 8.0 (poziom API 26) w przypadku niższych wersji Androida, może być konieczne użycie starszych interfejsów API – pcj