使用FCM v1协议抑制Android通知中的振动

使用FCM v1协议抑制Android通知中的振动,android,firebase,Android,Firebase,我看不出有什么方法可以通过FCMv1抑制Android系统通知的振动(即显示的通知横幅,包括应用程序未运行时)。我正在使用 在Android设备上,我可以选择在每个应用程序的基础上抑制通知上的声音,但无法在每个应用程序的基础上抑制振动。对我来说,唯一的办法就是禁用整个系统的振动,这是不可取的 我试图通过在FCM消息中这样做来解决问题 在SDK中,有一个选项可以不遵循默认的振动模式,并通过阵列设置特定的振动模式(请参阅)。因此: 我将默认\u振动\u计时设置为False 并将振动定时设置为[0,

我看不出有什么方法可以通过FCMv1抑制Android系统通知的振动(即显示的通知横幅,包括应用程序未运行时)。我正在使用

在Android设备上,我可以选择在每个应用程序的基础上抑制通知上的声音,但无法在每个应用程序的基础上抑制振动。对我来说,唯一的办法就是禁用整个系统的振动,这是不可取的

我试图通过在FCM消息中这样做来解决问题

  • 在SDK中,有一个选项可以不遵循默认的振动模式,并通过阵列设置特定的振动模式(请参阅)。因此:
  • 我将
    默认\u振动\u计时设置为
    False
  • 并将
    振动定时设置为
    [0,0]

希望这不会导致振动。但是,这不起作用,并且通知会在目标设备上振动。还有别的办法吗?(我不确定stackoverflow是否是解决特定工具集问题的最佳论坛,但Google)

我就是这么做的。我实现了一个自定义FirebaseService:

public class AppFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(@NonNull String token) {
        super.onNewToken(token);

        // do something with your token
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (remoteMessage.getData().size() > 0) {
            // do what you want
        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
        }

    }
}
并在清单中添加:

<service
    android:name=".AppFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>


在这种情况下,发送数据消息允许您保持正常通知的默认行为

为什么不能将重要性设置为NotificationManager的通知推送。重要性较低?重要性较低也会降低消息的优先级,导致其中一些消息根本不会显示在系统通知中,这并非目的。它需要显示,但没有振动。因此,即使用户不希望在状态栏中显示静默通知,您也要显示通知吗?在这种情况下,您需要发送不带通知部分的数据消息,然后在onMessageReceived()中处理通知。如果应用程序未运行,则不会调用MessageReceived()并执行任何您想要的操作。我想要的是类似于Android 8及以下版本的行为——也就是说,无论我的应用程序是否正在运行,当收到通知时,操作系统会在系统托盘中显示通知(确实如此),但用户可以选择在每个应用程序的基础上禁用声音(可能通过应用程序通知设置)和/或禁用该应用程序通知的振动(在Android 8及以下版本中可能,但振动作为启动Android 9的一个选项被取消)。唯一的选择似乎是在系统范围内禁用振动。这不是真的。当应用程序位于后台时,您可以收到数据消息。您需要实现自己的服务并处理自己接收的onmessage。我过去做过。我会发布代码谢谢-但如果应用程序没有运行,这将不起作用-也就是说,被杀死。仅当应用程序仍在运行(前台或后台)时,才会调用此处理程序。这就是我不能使用数据通知的原因。如果应用程序被终止,那么它的处理程序只有在下一次返回时才会被调用。你为什么说它不会工作?即使应用程序被终止,推送通知也会起作用