Как получить светодиодное уведомление?
Обновление: я перерабатываю оригинальное сообщение для совместимости перед 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, и свет не работает ни на одном. Экран отключается, когда я запускаю тесты, а все остальные приложения на телефонах запускают свет без проблем.
Ответы
Ответ 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();