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

}

}

Другие вопросы по тегам