可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am basically just experimenting with Android development, and a couple of days ago I came across this app called "Go SMS Pro", which, among other things, can set up notifications in different colors (blue, green, orange, pink and light blue). So, I have tried to do this myself in my own app, however I cannot change neiher the color nor the blinking internal of the LED. I currently use this code:
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);
}
};
}
But as I said, it doesn't work the way I want it to; instead it just blinks in regular green with the default delay, and not the one I have set in my code.
Can anyone see what is wrong with my code, or know if I have to do something else to achieve this?
回答1:
You can use this code:
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);
}
Instead of using ARGB value as the example show, you can use int property inside android.graphics.Color
class to get the color as well (e.g. Color.WHITE
)
回答2:
Did you try: .setLights(Color.BLUE, 500, 500) ?
Works fine on S3, N5, N4, Nexus one too..
回答3:
Leds are a quite non-standard feature in android phones. If you depend in them, you will miss a good chunk of the user base (consider, for example, the SGS phones, which do not even have leds).
That said, id the int field ledARGB was not useful, you might need to look into some JNI call from that APK. My guess is that it will have different methods depending on the device in which is running.
回答4:
FLAG_SHOW_LIGHTS and Notification.Builder.setLights(int,int,int); are deprecated since Android O ( API level 26 ) If you plan to use this feature in API level 26 or greater have look at 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);
But in this new implementation You may not have control over LED on milli-seconds & LED off milli-seconds it will be dependent on hardware.
回答5:
Try using the hex color, include an alpha value and set the defaults to 0:
notification.defaults = 0;
notification.ledARGB = 0xff0000ff;
Also, the notification interface says this:
public int ledARGB
Since: API Level 1
The color of the led. The hardware will do its best approximation.
I'm assuming your hardware has all the colors, but it may not.
回答6:
Have a look on source below.
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:
Support for the LED colors is really spotty. Try unplugging your USB cable and making sure that no other app is trying to modify the LED at the same time. Also turn off the screen.
回答8:
I have tried my code below, and the light works fine for me. My mobile is 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);
Meaning, remove 'DEFAULT_ALL' settings.