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

Как получить светодиодное уведомление?

Обновление: я перерабатываю оригинальное сообщение для совместимости перед Android 3.0.

Я пытаюсь создать простое уведомление, и все, кроме света, отлично работает. У меня есть экран, когда срабатывает уведомление. Использование этого устаревшего звука и вибраций кода работает на Android 4.0 (Galaxy Nexus) и Android 2.3 (HTC EVO).

  • На 2.3 HTC EVO также работают лампы.
  • В 4.0 Galaxy Nexus свет не работает.

    Notification notification = 
            new Notification(R.drawable.ic_launcher, "My Ticker!",System.currentTimeMillis());
    notification.setLatestEventInfo(context, "My Title", "My Message", pendingIntent);
    notification.defaults |= Notification.DEFAULT_SOUND;
    notification.defaults |= Notification.DEFAULT_VIBRATE;
    
    //notification.defaults |= Notification.DEFAULT_LIGHTS;
    
    notification.ledARGB = 0xff00ff00;
    notification.ledOnMS = 300;
    notification.ledOffMS = 1000;
    notification.flags |= Notification.FLAG_SHOW_LIGHTS;
    
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    

Я также попробовал новые API, которые не являются частью библиотеки совместимости v4, поэтому я мог только проверить это на Galaxy Nexus. Вибрация и звук снова работают, но не светятся.

Notification.Builder builder = new Notification.Builder(context);
        builder.setContentIntent(pendingIntent)
            .setSmallIcon(R.drawable.ic_launcher)
            .setTicker("My Ticker")
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND | Notification.FLAG_SHOW_LIGHTS)
            .setLights(0xff00ff00, 300, 100)
            .setContentTitle("My Title 1")
            .setContentText("My Text 1");
        Notification notification = builder.getNotification();

Теперь я тестировал это на двух телефонах Galaxy Nexus, и свет не работает ни на одном. Экран отключается, когда я запускаю тесты, а все остальные приложения на телефонах запускают свет без проблем.

4b9b3361

Ответ 1

Если вы используете setDefaults (DEFAULT_LIGHTS) или setDefaults (DEFAULT_ALL), он будет игнорировать FLAG_SHOW_LIGHTS и любые вызовы setLights(). Я обнаружил, что по моему телефону значения по умолчанию ничего не загорают. Поэтому не используйте DEFAULT_ALL или DEFAULT_LIGHTS и играйте с цветом RGB, если необходимо... хотя 0xff00ff00 должен работать практически во всех случаях.

Ответ 2

Светодиод работает, когда устройство выключено (не выключено: P). Чтобы проверить, написать простое приложение для создания уведомления с задержкой и во время задержки, выключите телефон и дождитесь, пока светодиод начнет мигать.

Ответ 3

Пришел через это сегодня.. если он по-прежнему полезен... Только определенные уведомления с приоритетом - HIGH, MAX могут привести к тому, что светодиод будет светиться, в то время как те, у кого низкий приоритет LOW, MIN, не должны. Добавление этого должно привести к тому, что светодиодный свет...

builder.setPriority(Notification.PRIORITY_MAX)

Ответ 4

4 ленивые люди:

private void testNotification() {
    Notification.Builder builder = new Notification.Builder(this);
    builder.setSmallIcon(R.drawable.ic_launcher)
        .setPriority(Notification.PRIORITY_HIGH)
        .setOngoing(true);
    builder.setLights(0xff00ff00, 300, 100);
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    manager.notify(1, builder.build());
}

Ответ 5

Я так долго боролся с этим! Leds отлично работал на устройствах Samsung, но на других - вообще не повезло. Наконец, я нашел решение; настроить прослушиватели для включения и выключения событий:

registerReceiver(this.screenOnListener, new IntentFilter("android.intent.action.SCREEN_ON"));
registerReceiver(this.screenOffListener, new IntentFilter("android.intent.action.SCREEN_OFF"));

Затем добавьте набор и отмените уведомление для этих слушателей:

public class ScreenOffListener extends BroadcastReceiver
{
    public ScreenOffListener() {}

    public void onReceive(Context paramContext, Intent paramIntent)
    {
        Notification notif = new Notification();
        notif.ledARGB = "0xFFFF0000"; // Red
        notif.flags = Notification.FLAG_SHOW_LIGHTS;
        notif.ledOnMS = 200; 
        notif.ledOffMS = 200; 
        nm.notify(NOTIFICATION_ID, notif);
    }
}

public class ScreenOnListener extends BroadcastReceiver
{
    public ScreenOnListener() {}

    public void onReceive(Context paramContext, Intent paramIntent)
    {
        NotificationTest.nm.cancel(NOTIFICATION_ID);
    }
}   

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

Примечание. Цвет и время включения/выключения действительно не работают, по крайней мере, для мигающих светодиодов. Они определяются HW и LPG (Led Pattern Generator), так что они работают также в глубоком сне, когда процессор более или менее выключен, и поэтому поддерживаемые шаблоны и цвета зависят от HW, который у вас есть. В большинстве систем есть только один мигающий шаблон, и цвета могут быть полностью сведены на полный R, G и B (и комбинации). Для полностью освещенных светодиодов все цвета доступны.

Ответ 6

Если вы хотите включить подсветку экрана при получении уведомления, я бы предложил использовать PowerManager и WakeLock. Ниже приведен код, чтобы включить экран, используя указанные классы:

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
                                 | PowerManager.ACQUIRE_CAUSES_WAKEUP
                                 | PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
wakeLock.acquire();

ПРИМЕЧАНИЕ. Не забудьте освободить wakeLock с помощью wakeLock.release();, иначе экран останется включенным.

P.S. Пользователь также может отключить экран с помощью кнопки блокировки. Я сделал то же самое в своем приложении. Я не использую wakeLock.release(); и оставляю его пользователю, чтобы отключить экран.

Ответ 7

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

Ответ 8

.SetLights (Color.Red.ToAndroid (), 300, 300)

Ответ 9

Добавьте уведомление по умолчанию .DEFAULT_LIGHTS.

Пример:

Notification notification = new NotificationCompat.Builder(baseCtx)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(title)
            .setContentText(body)
            .setDefaults(
                      Notification.DEFAULT_SOUND
                    | Notification.DEFAULT_VIBRATE
                    | Notification.DEFAULT_LIGHTS
            )
            .build();