Поиск…


Вступление

Firebase Cloud Messaging (FCM) - это межплатформенное решение для обмена сообщениями, которое позволяет надежно доставлять сообщения без каких-либо затрат.

Используя FCM, вы можете уведомить клиентское приложение о том, что для синхронизации доступны новые электронные или другие данные. Вы можете отправлять уведомляющие сообщения для вовлечения пользователей и их удержания. Для таких случаев, как обмен мгновенными сообщениями, сообщение может передавать полезную нагрузку до 4KB в клиентское приложение.

Настройка клиентского приложения CloudBase Firebase на Android

  1. Заполните раздел « Установка и настройка», чтобы подключить ваше приложение к Firebase.
    Это создаст проект в Firebase.

  2. Добавьте зависимость для облачных сообщений Firebase к файлу build.gradle уровне build.gradle :

dependencies {
     compile 'com.google.firebase:firebase-messaging:10.2.1'
}

Теперь вы готовы работать с FCM в Android.

Для клиентов FCM требуются устройства под управлением Android 2.3 или более поздней версии, в которых также установлено приложение Google Play Store или эмулятор под управлением Android 2.3 с API Google.

Измените файл AndroidManifest.xml

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

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

Регистрационный токен

При первом запуске вашего приложения FCM SDK генерирует регистрационный токен для экземпляра клиентского приложения.
Если вы хотите настроить таргетинг на отдельные устройства или создать группы устройств, вам необходимо получить доступ к этому токену, расширив FirebaseInstanceIdService .

onTokenRefresh вызов onTokenRefresh срабатывает всякий раз, когда генерируется новый токен, и вы можете использовать метод FirebaseInstanceID.getToken() для извлечения текущего токена.

Пример:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

   /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. Note that this is called when the InstanceID token
     * is initially generated so this is where you would retrieve the token.
     */

    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);

    }

}

Этот код, который я применил в своем приложении для нажатия изображения, сообщения, а также ссылки для открытия в вашем веб-браузере

Это мой сервис FirebaseMessagingService

    public class MyFirebaseMessagingService extends FirebaseMessagingService { 
Bitmap bitmap;
@Override 
public void onMessageReceived(RemoteMessage remoteMessage) {
    String message = remoteMessage.getData().get("message");
    //imageUri will contain URL of the image to be displayed with Notification 
    String imageUri = remoteMessage.getData().get("image");
    String link=remoteMessage.getData().get("link");
 
    //To get a Bitmap image from the URL received 
    bitmap = getBitmapfromUrl(imageUri);
    sendNotification(message, bitmap,link);
 
} 
 
 
/** 
 * Create and show a simple notification containing the received FCM message. 
 */ 
 
private void sendNotification(String messageBody, Bitmap image, String link) {
    Intent intent = new Intent(this, NewsListActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("LINK",link);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);
    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setLargeIcon(image)/*Notification icon image*/
            .setSmallIcon(R.drawable.hindi)
            .setContentTitle(messageBody)
            .setStyle(new NotificationCompat.BigPictureStyle()
                    .bigPicture(image))/*Notification with Image*/
            .setAutoCancel(true) 
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);
    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 
    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
} 
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();
        Bitmap bitmap = BitmapFactory.decodeStream(input);
        return bitmap;
 
    } catch (Exception e) {
        // TODO Auto-generated catch block 
        e.printStackTrace();
        return null; 
 
    } 
}} 

И это MainActivity, чтобы открывать ссылку в моем WebView или другом браузере на ваше требование по намерениям.

if (getIntent().getExtras() != null) {
    if (getIntent().getStringExtra("LINK")!=null) {
        Intent i=new Intent(this,BrowserActivity.class);
        i.putExtra("link",getIntent().getStringExtra("LINK"));
        i.putExtra("PUSH","yes");
        NewsListActivity.this.startActivity(i);
        finish();
    }} 

Получать сообщения

Чтобы получать сообщения, используйте службу, которая расширяет FirebaseMessagingService и переопределяет метод onMessageReceived .

public class MyFcmListenerService extends FirebaseMessagingService {
    
    /**
     * Called when message is received.
     *
     * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
     */
    @Override
    public void onMessageReceived(RemoteMessage message) {
        String from = message.getFrom();

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data payload: " + remoteMessage.getData());
            Map<String, String> data = message.getData();
        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }

        //.....
    }

Когда приложение находится в фоновом режиме, Android направляет уведомления на системный трей. Пользователь, нажав на уведомление, открывает по умолчанию программу запуска приложений.

Сюда входят сообщения, содержащие как полезную нагрузку для уведомлений, так и данные (и все сообщения, отправленные с консоли уведомлений). В этих случаях уведомление доставляется на системный лоток устройства, а полезная нагрузка данных доставляется в дополнение к назначению вашей активности запуска.

Вот краткое описание:

Состояние приложения уведомление Данные И то и другое
передний план onMessageReceived onMessageReceived onMessageReceived
Фон Системный лоток onMessageReceived Уведомление: системный трей
Данные: в дополнение к намерениям.

Подписаться на тему

Приложения для клиентов могут подписаться на любую существующую тему или создать новую тему. Когда клиентское приложение подписывается на новое имя темы, в FCM создается новый раздел этого имени, и любой клиент может впоследствии подписаться на него.

Чтобы подписаться на тему, используйте метод subscribeToTopic() определяющий имя темы:

FirebaseMessaging.getInstance().subscribeToTopic("myTopic");


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow