Android O: локализация канала уведомлений
Я создал канал уведомлений следующим образом:
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, и канал создается с языком, который использовался во время создания, поэтому, если я в конечном итоге поменяю язык моего устройства, этот канал останется на старом языке. Есть ли способ преодолеть это или это ограничение, то есть по замыслу?
3 ответа
Чтобы применить новый язык к вашему каналу уведомлений, вам нужно прослушать трансляцию ACTION_LOCALE_CHANGED в своем приложении и снова вызвать createNotificationChannel в своем приемнике.
Воссоздание каналов обновит ваши строки на новом языке (никакие другие функции канала не будут изменены). Вы можете увидеть это в документации.
Вы можете просто создать канал каждый раз, когда запускается ваша основная деятельность. Довольно элегантное решение без использования каких-либо вещательных приемников. Таким образом, канал всегда будет получать свежие значения из ваших строковых ресурсов, даже если вы добавляете больше языков. (Преждевременная оптимизация - корень всего зла.)
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
После того, как вы создали канал, вы ничего не можете изменить в нем. Поскольку мы предоставляем "String" для имени канала, система всегда будет представлять это имя пользователю.
Одна (плохая) вещь, которую вы можете попробовать, это удалить старый канал и создать еще один, имеющий имя на текущем языке.
Вы можете запросить это улучшение функции в Issue Tracker
Обновление- ответ @jmart правильный. /questions/13829932/android-o-lokalizatsiya-kanala-uvedomlenij/13829951#13829951
Это мое решение:
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());
}
}