2011-05-29 15 views
24

estoy básicamente sólo experimentando con el desarrollo de Android, y un par de días me encontré con esta aplicación llamada "Go SMS Pro", que, entre otras cosas, se pueden configurar las notificaciones en diferentes colores (azul, verde , naranja, rosa y azul claro). Por lo tanto, he tratado de hacer esto yo mismo en mi propia aplicación, sin embargo, no puedo cambiar ni el color ni el parpadeo interno del LED. Actualmente utilizo este código:Cambio de color del LED para las notificaciones

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

Pero, como dije, no funciona de la manera que yo quiero que; en su lugar, solo parpadea en verde normal con el retraso predeterminado, y no el que he establecido en mi código.

¿Alguien puede ver lo que está mal con mi código, o saber si tengo que hacer algo más para lograrlo?

Respuesta

2

Trate de usar el color hexadecimal, incluir un valor alfa y establecer los valores por defecto a 0:

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

Además, la interfaz de notificación dice esto:

public int ledARGB 
Since: API Level 1 

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

Estoy asumiendo su hardware tiene todos los colores, pero puede que no.

+0

He intentado configurar 'notification.defaults' a' 0' y 'notification.ledARGB' a un valor hexadecimal (aunque' Color.BLUE' tiene el valor constante de '0xff0000ff' de todos modos), pero ninguno de esos las cosas funcionan También soy consciente de que el hardware puede hacer una aproximación, pero estoy seguro de que al menos debería ser capaz de hacer los colores verde, azul, naranja y rosa. – Frxstrem

+0

Bastante extraño. ¿La aplicación ** Go SMS Pro ** cambia con éxito los colores en su teléfono? Sé que algunos teléfonos tienen problemas con los cambios de color de las notificaciones LED. – Femi

+0

Sí, lo hace, al menos con los colores preestablecidos en esa aplicación (como mencioné, verde, azul, naranja y rosa). Sin embargo, he probado algunas otras aplicaciones que se supone que cambian el color del LED, que no funcionan, y que acaban mostrando una luz verde parpadeante, sin importar el color al que estén configuradas, al igual que mi aplicación. – Frxstrem

10

Los Leds son una característica bastante no estándar en los teléfonos Android. Si dependes de ellos, perderás una buena parte de la base de usuarios (ten en cuenta, por ejemplo, los teléfonos SGS, que ni siquiera tienen leds).

Dicho esto, si el campo int led ledARGB no fue útil, es posible que deba buscar alguna llamada JNI desde ese APK. Supongo que tendrá diferentes métodos según el dispositivo en el que se esté ejecutando.

+0

Quiero implementar esto https://stackoverflow.com/questions/25479517/change-notification-led-color-if-it-is-previously-set-by-the-creator-application Por favor, guíame cómo hacer eso . –

1

El soporte para los colores LED es muy irregular. Intenta desconectar el cable USB y asegúrate de que ninguna otra aplicación esté intentando modificar el LED al mismo tiempo. También apaga la pantalla.

+0

Bueno, estoy bastante seguro de que ni el USB, ni otras aplicaciones ni la pantalla están causando esto, porque obtengo una luz parpadeante, aunque no es la velocidad parpadeante ni el color que solicito. Creo que es más bien algo en el código en sí, ya que mi propio código, y muchas de las aplicaciones que encuentro en el mercado, etc., tienen los problemas que describo, mientras que otras pocas aplicaciones no funcionan y realmente funcionan. – Frxstrem

+0

¿Es esto un Nexus One con una versión 2.3.4 o algo más? –

12

Puede utilizar este código:

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

En lugar de utilizar el valor ARGB como el ejemplo espectáculo, puede utilizar la propiedad int dentro android.graphics.Color clase para obtener el color también (por ejemplo Color.WHITE)

+0

Aparte de algunas pequeñas diferencias, esto básicamente ** es ** el código que estoy usando ... – Frxstrem

+0

Lo sé, te escribí todo para que puedas hacer esa diferencia en tu código. Puede ser que funcione. Como funciona en mi dispositivo – Stuti

+3

Bueno, no funciona, ya lo he intentado (antes de hacer la pregunta) ... Y también, dado que los LED funcionan de manera diferente en diferentes dispositivos y es probable que no lo hayas probado en el mismo Como ya he dicho, no es particularmente útil que funcione en su dispositivo; este código probablemente funcione en muchos dispositivos, pero no en el mío, ese es el problema. – Frxstrem

11

Did intenta: .setLights (Color.BLUE, 500, 500)?

funciona bien en S3, N5, N4, Nexus uno también ..

+0

Solo para obtener información, ha quedado obsoleta desde la API nivel 26, consulte mi respuesta a continuación: https://stackoverflow.com/questions/6169291/changing-led-color-for-notifications/45793450#45793450 – pcj

1

echar un vistazo a la fuente a continuación.

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

He intentado mi código a continuación, y la luz funciona bien para mí. Mi móvil es 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); 

Significado, eliminar la configuración 'DEFAULT_ALL'.

2

FLAG_SHOW_LIGHTS y Notification.Builder.setLights(int,int,int); están en desuso desde Android O (nivel de la API 26) Si va a utilizar esta característica en el nivel de la API 26 o superior tienen vistazo a NotificationChannel

Example:

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

Pero en este nueva implementación Es posible que no tenga control sobre LED on milli-seconds & LED off milli-seconds que dependerá del hardware.

+0

¿Puede seguir utilizando el método anterior si tiene un nivel de API inferior? – Michael

+0

Como se introdujo desde Android 8.0 (nivel de API 26) para versiones inferiores de Android, puede que tenga que usar las API anteriores – pcj

Cuestiones relacionadas