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

}

}