【问题标题】:How to have LED Light Notification?如何有 LED 灯通知?
【发布时间】:2012-05-01 18:56:49
【问题描述】:

更新:我正在修改原始帖子以实现 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;
    

我还尝试了不属于 v4 兼容性库的更新 API,因此我只能在 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 手机上进行了测试,但两者都无法正常工作。当我运行测试时屏幕关闭,手机上的所有其他应用程序触发灯没有问题。

【问题讨论】:

    标签: android


    【解决方案1】:

    如果您使用 setDefaults(DEFAULT_LIGHTS) 或 setDefaults(DEFAULT_ALL),它将忽略 FLAG_SHOW_LIGHTS 和任何对 setLights() 的调用。我发现在我的手机上,默认设置不会点亮任何东西。所以不要使用 DEFAULT_ALL 或 DEFAULT_LIGHTS,如有必要,请使用 RGB 颜色……尽管 0xff00ff00 几乎适用于所有情况。

    【讨论】:

    • 没有灯光:.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE) .setLights(0xff00ff00, 300, 100)
    • 什么手机?根?自定义ROM?
    • Galaxy Nexus 库存,我也尝试过使用 HTC Evo Android 2.3 手机。我已经修改了帖子以显示此更新的信息。
    【解决方案2】:

    今天遇到这个..如果它仍然有用... 只有某些具有优先级的通知 - HIGH,MAX 才能使 LED 发光, 而那些优先级较低的 LOW,MIN 则不应该。 添加这个应该会使 LED 发光...

    builder.setPriority(Notification.PRIORITY_MAX)

    【讨论】:

    • 默认优先级也会使 LED 发光。
    【解决方案3】:

    当设备关闭(未关闭:P)时,LED 会工作。测试编写一个简单的应用程序来创建延迟通知,并在延迟期间关闭手机并等待 LED 闪烁。

    【讨论】:

      【解决方案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】:

        如果你想在收到通知时打开屏幕灯,我建议使用PowerManagerWakeLock。以下是使用上述类打开屏幕的代码:

        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.release(); 释放wakeLock,否则屏幕将保持打开状态。

        附:用户还可以使用锁定按钮关闭屏幕。我在我的应用程序中做了同样的事情。我没有使用wakeLock.release();,而是让用户关闭屏幕。

        【讨论】:

        • 自 API 19 起,已弃用
        【解决方案6】:

        我在下面尝试了我的代码,它对我来说很好。我的手机是 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”设置。

        【讨论】:

          【解决方案7】:

          我也为此奋斗了好多年! Leds 在三星设备上运行良好,但在其他设备上则完全没有运气。不过,我终于找到了解决方案;设置监听器来屏蔽开启和关闭事件:

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

          现在为我工作。由于某种奇怪的原因,此时需要设置通知,否则 LED 不起作用。通知中的所有其他内容在随时设置时都可以正常工作...

          注意:至少对于闪烁的 LED,颜色和开/关时间并不真正起作用。它们由 HW 和 LPG(LED 图案生成器)定义,因此当 CPU 或多或少关闭时它们也可以在深度睡眠中工作,因此支持的图案和颜色取决于您拥有的硬件。大多数系统只有一种闪烁模式,并且颜色可能会减少到完全关闭 R、G 和 B(以及组合)。对于完全点亮的 LED,所有颜色似乎都可用。

          【讨论】:

            【解决方案8】:
            .SetLights (Color.Red.ToAndroid (), 300, 300)
            

            【讨论】:

            • 其实是'setLights',没有'Color.Red.ToAndroid()'。
            【解决方案9】:

            添加默认 Notification.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();
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-04-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多