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

Изменение цвета светодиода для уведомлений

В основном я просто экспериментирую с разработкой Android, и пару дней назад я встретил это приложение под названием " Go SMS Pro", который, между прочим, может настраивать уведомления в разных цветах (синий, зеленый, оранжевый, розовый и голубой). Итак, я попытался сделать это сам в своем собственном приложении, однако я не могу изменить нийер цвет или мигание внутреннего светодиода. В настоящее время я использую этот код:

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

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

Может ли кто-нибудь увидеть, что не так с моим кодом, или знать, нужно ли мне что-то сделать для этого?

4b9b3361

Ответ 1

Вы можете использовать этот код:

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

Вместо того, чтобы использовать значение ARGB в качестве примера show, вы можете использовать свойство int внутри класса android.graphics.Color, чтобы получить цвет (например, Color.WHITE)

Ответ 2

Вы пытались:.setLights(Color.BLUE, 500, 500)?

Работает нормально на S3, N5, N4, Nexus тоже.

Ответ 3

Leds - довольно нестандартная функция в телефонах Android. Если вы зависте в них, вы пропустите хороший кусок базы пользователей (подумайте, например, о телефонах SGS, которые даже не имеют светодиодов).

Тем не менее, id int field ledARGB не был полезен, вам, возможно, придется заглянуть в какой-то вызов JNI из этого APK. Я предполагаю, что он будет иметь разные методы в зависимости от используемого устройства.

Ответ 4

Попробуйте использовать шестнадцатеричный цвет, включите альфа-значение и установите значения по умолчанию 0:

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

Кроме того, интерфейс уведомлений говорит следующее:

public int ledARGB
Since: API Level 1

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

Я предполагаю, что ваше оборудование имеет все цвета, но это может быть не так.

Ответ 5

FLAG_SHOW_LIGHTS и Notification.Builder.setLights(int, int, int); устарели с Android O (уровень API 26). Если вы планируете использовать эту функцию в API уровня 26 или выше, посмотрите NotificationChannel

Пример:

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

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

Ответ 6

Посмотрите на источник ниже.

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

Ответ 7

Поддержка цветов светодиодов действительно пятнистая. Попробуйте отключить USB-кабель и убедитесь, что ни одно другое приложение не пытается изменить светодиод одновременно. Также выключите экран.

Ответ 8

Я попробовал свой код ниже, и свет отлично работает для меня. Мой мобильный телефон - 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);

Значение, удалите настройки "DEFAULT_ALL".