自定义firebase通知

时间:2017-05-12 10:34:14

标签: android firebase android-notifications

我有一个聊天应用,其中用户订阅了一个主题,每个组都是一个主题。每当组中发送消息时。将向该主题发送通知。

我面临两个问题。

  1. 当发件人在组中发送邮件时,会向主题发送通知邮件。但是在用户从firebase获取通知之前,他关闭了应用程序,或者应用程序在后台运行。因此,根据firebase文档,通知将发送到通知托盘而不是onMessageReceived回调。

  2. 从firebase接收的通知将添加到托盘中。发件人以外的用户如何获取通知ID,以便在需要时可以取消。如何定制此通知?

  3. 当应用程序在后台或终止时,是否有办法让活动侦听器接收通知。

    请帮忙

2 个答案:

答案 0 :(得分:2)

你可能想看看this。起初,由于英语而不是我的主要语言,我总是在阅读文档时遇到问题。它非常混乱,但只需按照步骤进行操作即可获得更多信息。

对于您的第一个问题,您不需要同时使用通知和数据消息。如果您使用它,如果应用程序处于前台或强制关闭,它将阻止onMessageReceived()调用。相信我只需删除通知{notification:"data"},但在发送到firebase时保留{data:"something"}。它将始终触发onMessageReceived()

对于第二个问题,在您按照上述步骤操作后,您的状态栏上将不会显示任何通知。在这里,您可以检查此用户是发件人,如果不是发件人,那么您只需在onMessageReceived()内显示自定义通知。

答案 1 :(得分:0)

您可以通过发送通知,将通知推送到您的应用程序,以使用户与火力基地互动,当您的应用程序关闭时,根据一些参数,可以将火力基地火力。

确保在执行此操作之前先将您的项目添加到Firebase中:否则,将您的项目添加到Firebase中,并在项目的应用文件夹中添加程序包名称,指纹和google_services.json文件。

Fire base Cloud Messaging

它将推送通知到您的应用程序,如果它已关闭,则它允许用户通过按下通知来打开应用程序,并且如果您想向用户显示通知以定向到同一帐户的其他应用程序,则该应用程序将会同时在这两个代码中发生:

创建一流的课程 MyFirebaseMessagingService

public class MyFirebaseMessagingService extends FirebaseMessagingService {

private static final String NOTIFICATION_ID_EXTRA = "notificationId";
private static final String IMAGE_URL_EXTRA = "imageUrl";
private static final String ADMIN_CHANNEL_ID ="admin_channel";
private NotificationManager notificationManager;


@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    if (remoteMessage.getData().size()>0){

        Intent notificationIntent = new Intent(Intent.ACTION_VIEW);
        notificationIntent.setData(Uri.parse(remoteMessage.getData().get("applink")));
        PendingIntent pi = PendingIntent.getActivity(this, 0, notificationIntent, 0);
        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        final PendingIntent pendingIntent = PendingIntent.getActivity(this,
                0 /* Request code */, notificationIntent,
                PendingIntent.FLAG_ONE_SHOT);

        int notificationId = new Random().nextInt(60000);
        Bitmap bitmap = getBitmapfromUrl(remoteMessage.getData().get("imageurl"));

        Intent likeIntent = new Intent(this,LikeService.class);
        likeIntent.putExtra(NOTIFICATION_ID_EXTRA,notificationId);
        likeIntent.putExtra(IMAGE_URL_EXTRA,remoteMessage.getData().get("message"));
        PendingIntent likePendingIntent = PendingIntent.getService(this,
                notificationId+1,likeIntent, PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

            setupChannels();

        }

        NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this, ADMIN_CHANNEL_ID)
                        .setLargeIcon(bitmap)
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setContentTitle(remoteMessage.getData().get("title"))
                        .setStyle(new NotificationCompat.BigPictureStyle()
                                .setSummaryText(remoteMessage.getData().get("message"))
                                .bigPicture(bitmap))/*Notification with Image*/
                        .setContentText(remoteMessage.getData().get("message"))
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .addAction(R.drawable.icon,
                                getString(R.string.notification_add_to_cart_button),likePendingIntent)
                        .setContentIntent(pendingIntent);

        notificationManager.notify(notificationId, notificationBuilder.build());


    }

}


@RequiresApi(api = Build.VERSION_CODES.O)
private void setupChannels(){
    CharSequence adminChannelName = getString(R.string.notifications_admin_channel_name);
    String adminChannelDescription = getString(R.string.notifications_admin_channel_description);

    NotificationChannel adminChannel;
    adminChannel = new NotificationChannel(ADMIN_CHANNEL_ID, adminChannelName, NotificationManager.IMPORTANCE_LOW);
    adminChannel.setDescription(adminChannelDescription);
    adminChannel.enableLights(true);
    adminChannel.setLightColor(Color.RED);
    adminChannel.enableVibration(true);
    if (notificationManager != null) {
        notificationManager.createNotificationChannel(adminChannel);
    }
}



public Bitmap getBitmapfromUrl(String imageUrl) {
    try {
        URL url = new URL(imageUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        return BitmapFactory.decodeStream(input);

    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}


    }

创建另一个类 FirebaseIDService 以获取Fire Base的实例ID服务

public class FirebaseIDService extends FirebaseInstanceIdService {


public static final String FIREBASE_TOKEN = "firebase token";

@Override
public void onTokenRefresh() {
    super.onTokenRefresh();

    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    SharedPreferences preferences =
            PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    preferences.edit().putString(FIREBASE_TOKEN, refreshedToken).apply();

}

设为类别名称 LikeService

public class LikeService extends Service {

private static final String NOTIFICATION_ID_EXTRA = "notificationId";
private static final String IMAGE_URL_EXTRA = "imageUrl";
@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}
    }

要使用Firebase在Oreo上支持通知,请不要忘记创建频道,并且该频道会在首次启动器活动中初始化。

在创建项目时,第一个启动器活动包括以下渠道;

   String channelId = "1";
    String channel2 = "2";

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        NotificationChannel notificationChannel = new NotificationChannel(channelId,
                "Channel 1", NotificationManager.IMPORTANCE_HIGH);

        notificationChannel.setDescription("This is BNT");
        notificationChannel.setLightColor(Color.RED);
        notificationChannel.enableVibration(true);
        notificationChannel.setShowBadge(true);
        notificationManager.createNotificationChannel(notificationChannel);

        NotificationChannel notificationChannel2 = new NotificationChannel(channel2,
                "Channel 2",NotificationManager.IMPORTANCE_MIN);

        notificationChannel.setDescription("This is bTV");
        notificationChannel.setLightColor(Color.RED);
        notificationChannel.enableVibration(true);
        notificationChannel.setShowBadge(true);
        notificationManager.createNotificationChannel(notificationChannel2);

    }

现在,您必须将Firebase服务类放在 Mainfest中的应用程序标签下:

      <service android:name=".activities.services.MyFirebaseMessagingService"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>

            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            <action android:name="com.google.android.c2dm.intent.RECEIVE"/>

        </intent-filter>

    </service>

    <service android:name=".activities.services.FirebaseIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

现在在使用Fire Base进行推送通知之前,先在设备上运行您的应用程序,确保您的代码已正确集成,然后运行app:并启动Fire Base云消息传递:

根据您的应用程序将数据放入照片中:关闭时:

enter image description here

如果您的应用正在使用中,则将显示“预先写入的数据”选项,其中包含有关同一帐户的促销应用的数据,请不要在此处使用其他帐户的应用,

确保您的密钥应与MyFirebaseMessagingService中已收到的 onMessagede 类相同。

喜欢

标题,消息,应用链接,图片网址

enter image description here