Android O:通知通道本地化
Android O: Notification Channel localization
我创建了一个这样的通知通道:
NotificationChannel channel = new NotificationChannel(CHANNEL_ID_FOOBAR, getContext().getString(R.string.notification_channel_foobar), NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);
我为 R.string.notification_channel_foobar 提供了不同的翻译,并且频道是使用创建时使用的语言创建的,因此如果我最终更改了我的设备,该频道将保留旧语言。有没有办法克服这个或者这是一个限制,即通过设计?
一旦您创建了频道,就无法对其进行任何更改。由于我们为频道名称提供 "String",系统将始终向用户表示此名称。
您可以尝试的一件(不好的)事情是删除旧频道并创建另一个以当前语言命名的频道。
您可以在 Issue Tracker
中请求此功能增强
更新-
@jmart 的回答是正确的。
要将新语言应用于您的通知渠道,您需要在您的应用程序中收听 ACTION_LOCALE_CHANGED 广播并在您的接收器中再次调用 createNotificationChannel。
重新创建频道会将您的字符串更新为新语言(none 的其他频道功能将被修改)。您可以在 documentation.
中看到它
您可以在每次主 activity 启动时简单地创建频道。非常优雅的解决方案,无需使用任何广播接收器。这样,通道将始终从您的字符串资源中获取新值,即使您正在添加更多语言也是如此。 (过早的优化是万恶之源。)
createNotificationChannel
命令将创建频道,如果频道尚未创建,如果频道已创建,它将更新频道。
如果频道已经创建,那么您唯一可以更改的是频道的名称和频道描述,没有其他的。重要性将被忽略,因为用户可能已经手动更改了频道的重要性。但即使他没有改变,重要性仍然不会更新,实际上这就是通知渠道的目的。让用户可以自由管理他们的频道,而不会在应用程序更新时开发人员干扰他们。
总而言之,通过声明:
NotificationChannel notificationChannel = new NotificationChannel("channel id", "channel new name", NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(notificationChannel);
在已创建的频道中,频道的名称会更新,但重要性不会更新。如果你也想更新频道描述,你可以这样做:
notificationChannel.setDescription("new description"); //set that before creating the channel
这是我的解决方案:
public class AlarmReceiver extends BroadcastReceiver {
public static String NOTIFICATION_CHANNEL_ID = "notification-id";
public static String NOTIFICATION = "Notification";
public static String DESCRIPTION = "Channel description";
@TargetApi(26)
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.e("RECEIVE", "received2");
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pi = PendingIntent.getActivity(context, intent.getIntExtra("NotifID", 1), new Intent(context, CalendarActivity.class),PendingIntent.FLAG_CANCEL_CURRENT);
// get current locale
String locale; // for getting locale
locale = Locale.getDefault().getLanguage();
if(locale.equalsIgnoreCase("sk")) {
NOTIFICATION = "Notifikácia";
DESCRIPTION = "Popis";
}
if (VERSION.SDK_INT >= 26) {
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION, NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setDescription(DESCRIPTION);
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.GREEN);
notificationChannel.setLockscreenVisibility(Notification.DEFAULT_SOUND);
notificationChannel.setVibrationPattern(new long[]{1000, 500, 500, 200, 200, 200});
notificationChannel.enableVibration(true);
manager.createNotificationChannel(notificationChannel);
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
builder.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setContentTitle(intent.getStringExtra("AppName"))
.setContentText(intent.getStringExtra("lname"))
.setSmallIcon(R.drawable.ic_launcher)
;
//manager.notify(1,builder.build());
manager.notify(intent.getIntExtra("NotifID", 1), builder.build());
}
}
我创建了一个这样的通知通道:
NotificationChannel channel = new NotificationChannel(CHANNEL_ID_FOOBAR, getContext().getString(R.string.notification_channel_foobar), NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);
我为 R.string.notification_channel_foobar 提供了不同的翻译,并且频道是使用创建时使用的语言创建的,因此如果我最终更改了我的设备,该频道将保留旧语言。有没有办法克服这个或者这是一个限制,即通过设计?
一旦您创建了频道,就无法对其进行任何更改。由于我们为频道名称提供 "String",系统将始终向用户表示此名称。
您可以尝试的一件(不好的)事情是删除旧频道并创建另一个以当前语言命名的频道。
您可以在 Issue Tracker
中请求此功能增强更新-
@jmart 的回答是正确的。
要将新语言应用于您的通知渠道,您需要在您的应用程序中收听 ACTION_LOCALE_CHANGED 广播并在您的接收器中再次调用 createNotificationChannel。
重新创建频道会将您的字符串更新为新语言(none 的其他频道功能将被修改)。您可以在 documentation.
中看到它您可以在每次主 activity 启动时简单地创建频道。非常优雅的解决方案,无需使用任何广播接收器。这样,通道将始终从您的字符串资源中获取新值,即使您正在添加更多语言也是如此。 (过早的优化是万恶之源。)
createNotificationChannel
命令将创建频道,如果频道尚未创建,如果频道已创建,它将更新频道。
如果频道已经创建,那么您唯一可以更改的是频道的名称和频道描述,没有其他的。重要性将被忽略,因为用户可能已经手动更改了频道的重要性。但即使他没有改变,重要性仍然不会更新,实际上这就是通知渠道的目的。让用户可以自由管理他们的频道,而不会在应用程序更新时开发人员干扰他们。
总而言之,通过声明:
NotificationChannel notificationChannel = new NotificationChannel("channel id", "channel new name", NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(notificationChannel);
在已创建的频道中,频道的名称会更新,但重要性不会更新。如果你也想更新频道描述,你可以这样做:
notificationChannel.setDescription("new description"); //set that before creating the channel
这是我的解决方案:
public class AlarmReceiver extends BroadcastReceiver {
public static String NOTIFICATION_CHANNEL_ID = "notification-id";
public static String NOTIFICATION = "Notification";
public static String DESCRIPTION = "Channel description";
@TargetApi(26)
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.e("RECEIVE", "received2");
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pi = PendingIntent.getActivity(context, intent.getIntExtra("NotifID", 1), new Intent(context, CalendarActivity.class),PendingIntent.FLAG_CANCEL_CURRENT);
// get current locale
String locale; // for getting locale
locale = Locale.getDefault().getLanguage();
if(locale.equalsIgnoreCase("sk")) {
NOTIFICATION = "Notifikácia";
DESCRIPTION = "Popis";
}
if (VERSION.SDK_INT >= 26) {
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION, NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setDescription(DESCRIPTION);
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.GREEN);
notificationChannel.setLockscreenVisibility(Notification.DEFAULT_SOUND);
notificationChannel.setVibrationPattern(new long[]{1000, 500, 500, 200, 200, 200});
notificationChannel.enableVibration(true);
manager.createNotificationChannel(notificationChannel);
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
builder.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setContentTitle(intent.getStringExtra("AppName"))
.setContentText(intent.getStringExtra("lname"))
.setSmallIcon(R.drawable.ic_launcher)
;
//manager.notify(1,builder.build());
manager.notify(intent.getIntExtra("NotifID", 1), builder.build());
}
}