web-dev-qa-db-fra.com

Changer la couleur des LED pour les notifications

Je suis en train d'expérimenter avec Android, et il y a quelques jours, je suis tombé sur cette application appelée " Go SMS Pro ", qui, entre autres, peut configurer des notifications dans différentes couleurs (bleu, vert, orange, rose et bleu clair). J'ai donc essayé de le faire moi-même dans ma propre application, mais je ne peux changer ni la couleur ni le clignotement interne de la LED. J'utilise actuellement ce code:

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

Mais comme je l'ai dit, cela ne fonctionne pas comme je le souhaite; au lieu de cela, il clignote simplement en vert normal avec le retard par défaut, et non celui que j'ai défini dans mon code.

Quelqu'un peut-il voir ce qui ne va pas avec mon code, ou savoir si je dois faire autre chose pour y parvenir?

28
Frxstrem

Vous pouvez utiliser ce code:

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

Au lieu d'utiliser la valeur ARGB comme le montre l'exemple, vous pouvez utiliser la propriété int dans Android.graphics.Color classe pour obtenir également la couleur (par exemple Color.WHITE )

12
Stuti

Avez-vous essayé: .setLights (Color.BLUE, 500, 500)?

Fonctionne très bien sur S3, N5, N4, Nexus one aussi ..

11
TheDevMan

Les Leds sont une fonctionnalité assez non standard dans les téléphones Android. Si vous dépendez d'eux, vous manquerez une bonne partie de la base d'utilisateurs (pensez, par exemple, aux téléphones SGS, qui ne ont même des leds).

Cela dit, id le champ int ledARGB n'était pas utile, vous devrez peut-être rechercher un appel JNI à partir de cet APK. Je suppose qu'il aura différentes méthodes en fonction de l'appareil sur lequel il s'exécute.

10
Aleadam

FLAG_SHOW_LIGHTS et Notification.Builder.setLights (int, int, int); sont déconseillés depuis Android O (API level 26) Si vous prévoyez d'utiliser cette fonctionnalité dans l'API level 26 ou supérieur, regardez NotificationChannel

Exemple :

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

Mais dans cette nouvelle implémentation, vous n'avez peut-être pas le contrôle sur LED en millisecondes & LED éteinte en millisecondes cela dépendra du matériel.

4
pcj

Essayez d'utiliser la couleur hexadécimale, incluez une valeur alpha et définissez les valeurs par défaut sur 0:

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

De plus, l'interface de notification dit ceci:

public int ledARGB
Since: API Level 1

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

Je suppose que votre matériel a toutes les couleurs, mais ce n'est peut-être pas le cas.

2
Femi

Jetez un oeil sur la source ci-dessous.

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

J'ai essayé mon code ci-dessous et la lumière fonctionne bien pour moi. Mon mobile est le 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);

Signification, supprimez les paramètres "DEFAULT_ALL".

1
Hal Cheung

Le support des couleurs LED est vraiment inégal. Essayez de débrancher votre câble USB et de vous assurer qu'aucune autre application n'essaie de modifier la LED en même temps. Éteignez également l'écran.

1
Ed Burnette