java - MIUI无声推送通知
问题描述
我的应用程序的主要功能是从远程服务器发送的推送通知消息。我使用 FCM 作为消息传递服务。我的问题是小米 Mi 9 Lite (Android 9/MIUI 11) 上的通知没有任何声音。但是,在小米红米 Note 5 (Android 9/MIUI 10) 上声音效果很好,在三星 Galaxy S7 Edge (Android 8) 上也可以。我创建了 MessagingService,它扩展了 FirebaseMessagingService 和通知通道,如文档中所写。
这是我的代码:
public class MessagingService extends FirebaseMessagingService {
private static String channelId;
private NotificationManager notificationManager;
private NotificationChannel notificationChannel;
private NotificationCompat.Builder notificationBuilder;
private MessagesViewModel viewModel;
public MessagingService() { }
@Override
public void onCreate() {
super.onCreate();
channelId = getResources().getString(R.string.default_notification_channel_id);
notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
final Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
notificationBuilder = new NotificationCompat.Builder(this, channelId);
notificationBuilder.setSmallIcon(R.raw.metrial_message_icon);
notificationBuilder.setAutoCancel(false);
notificationBuilder.setSound(soundUri);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
final AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
.build();
String name = getString(R.string.channel_name);
String description = getString(R.string.channel_description);
int importance = NotificationManager.IMPORTANCE_HIGH;
notificationChannel = new NotificationChannel(channelId, name, importance);
notificationChannel.setDescription(description);
notificationChannel.enableLights(true);
notificationChannel.setShowBadge(true);
notificationChannel.setSound(soundUri, audioAttributes);
notificationManager.createNotificationChannel(notificationChannel);
notificationBuilder.setChannelId(channelId);
}
else {
notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH);
notificationBuilder.setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL);
notificationBuilder.setLights(Color.WHITE, 500, 5000);
}
viewModel = new MessagesViewModel(getApplication());
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onNewToken(@NonNull String s) {
super.onNewToken(s);
logger.info("onNewToken()");
ConnectionParameters.getInstance().setToken(s);
MyPrefs.getInstance(getApplicationContext()).putString(Constants.TOKEN, s);
}
@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
final String messageId = remoteMessage.getData().get("message_id");
final String title = remoteMessage.getData().get("title");
final String body = remoteMessage.getData().get("body");
if (messageId != null && title != null && body != null) {
final Message message = new Message();
message.setMessageId(messageId);
message.setTitle(title);
message.setContent(body);
message.setTimestamp(new Date());
try {
message.setNotificationId((int)viewModel.insert(message));
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
logger.info("onMessageReceived(): notificationId=" + message);
if (MyPrefs.getInstance(getApplicationContext()).getBoolean(Constants.ENABLE_PUSH)) {
notificationBuilder.setContentTitle(title);
notificationBuilder.setContentText(body);
final Intent notifyIntent = new Intent(this, MessageInfoActivity.class);
notifyIntent.putExtra(Constants.ARG_MESSAGE_OBJECT, message);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(notifyIntent);
PendingIntent pendingActivityIntent =
stackBuilder.getPendingIntent(message.getNotificationId(), PendingIntent.FLAG_UPDATE_CURRENT);
notificationBuilder.setContentIntent(pendingActivityIntent);
final Notification notification = notificationBuilder.build();
notification.defaults = Notification.DEFAULT_SOUND|Notification.DEFAULT_LIGHTS;
notificationManager.notify(message.getNotificationId(), notification);
}
}
}
private final Logger logger = LoggerFactory.getLogger(getClass());
}
在Settings->Notifications我得到以下参数:
并且在我的推送通知通道中启用了声音,但是每当收到消息时,似乎应用程序通知设置会覆盖通知通道中的参数。
应该有一些解决方案,因为在 WhatsApp、Telegram 等流行应用程序中,这些开关在安装后启用(默认情况下)。希望,有人帮助!
解决方案
由于没有人提供更好的解决方案,我想没有办法在 MIUI(以及主要在其他中国 OEM)上以编程方式允许声音/徽章计数器/浮动通知。手动打开这些设置是用户的特权。因此,为了增强用户体验,尽可能减少“点击”的数量很重要。因此,我们可以提供一个对话框来描述如何使用通向 App 设置的按钮来启用上述功能。即要通过 Intent 打开通知设置页面,请执行以下操作:
final Intent notificationSettingsIntent = new Intent();
notificationSettingsIntent
.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
notificationSettingsIntent
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
notificationSettingsIntent.putExtra(
"android.provider.extra.APP_PACKAGE",
activity.getPackageName());
}
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
notificationSettingsIntent.putExtra(
"app_package",
activity.getPackageName());
notificationSettingsIntent.putExtra(
"app_uid",
activity.getApplicationInfo().uid);
}
activity.startActivityForResult(
notificationSettingsIntent,
NOTIFICATIONS_SETTINGS_REQUEST_CODE);
您可以使用“打开通知设置”按钮打开一个对话框,单击该按钮会触发上面的代码片段。
推荐阅读
- mysql - 如何将多行列和显示一行
- flutter - 如何在没有动画的情况下旋转材质图标?
- python - 在计划任务的情况下如何从芹菜中获取任务ID(节拍)
- javascript - 加载html后如何加载js文件?
- android - 使用 ffmpeg 与工作管理器在后台进行视频处理
- html - 如何在 CSS 中对齐左右两个部分?
- git - gitignore 有什么用?
- javascript - 在我将 angualr 5 更新为 7 之后,同时在 angular 1.x 中运行 angular 5 时,无法实例化模块 $$UpgradeModule?
- magento-1.9 - magento 1.9 版 Transactional Email 模板内容大小限制
- node.js - 如何在对话流中制作水平轮播?