Android
Firebase Cloud Messaging
Zoeken…
Invoering
Firebase Cloud Messaging (FCM) is een platformonafhankelijke berichtenoplossing waarmee u betrouwbaar en kosteloos berichten kunt afleveren.
Met FCM kunt u een client-app laten weten dat nieuwe e-mail of andere gegevens beschikbaar zijn om te synchroniseren. U kunt meldingsberichten verzenden om de gebruikers opnieuw te betrekken en te behouden. Voor gebruikssituaties zoals instant messaging, kan een bericht een nuttige lading van maximaal 4KB
overbrengen naar een client-app.
Stel een Firebase Cloud Messaging Client-app op Android in
Voltooi het gedeelte Installatie en instellingen om uw app te verbinden met Firebase.
Hiermee wordt het project in Firebase gemaakt.Voeg de afhankelijkheid voor Firebase Cloud Messaging toe aan uw
build.gradle
bestand opbuild.gradle
:
dependencies {
compile 'com.google.firebase:firebase-messaging:10.2.1'
}
Nu bent u klaar om te werken met de FCM in Android.
FCM-clients vereisen apparaten met Android 2.3
of hoger waarop ook de Google Play Store-app is geïnstalleerd, of een emulator met Android 2.3 met Google API's.
Bewerk uw AndroidManifest.xml
bestand
<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>
Registratie token
Bij het eerste opstarten van uw app genereert de FCM SDK een registratietoken voor het exemplaar van de client-app.
Als u afzonderlijke apparaten wilt targeten of apparaatgroepen wilt maken, moet u dit token openen door FirebaseInstanceIdService
breiden.
De callback onTokenRefresh
wanneer een nieuw token wordt gegenereerd en u kunt de methode FirebaseInstanceID.getToken()
gebruiken om het huidige token op te halen.
Voorbeeld:
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);
}
}
Deze code die ik in mijn app heb geïmplementeerd voor het pushen van afbeeldingen, berichten en ook koppelingen voor het openen in uw webView
Dit is mijn 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;
}
}}
En dit is MainActivity om een link in mijn WebView of een andere browser te openen, afhankelijk van uw vereisten via intenties.
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();
}}
Ontvang berichten
Om berichten te ontvangen, gebruikt u een service die FirebaseMessagingService
uitbreidt en de methode onMessageReceived
overschrijft.
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());
}
//.....
}
Wanneer de app op de achtergrond staat, stuurt Android meldingsberichten naar het systeemvak. Een gebruiker die op de melding tikt, opent standaard het app-opstartprogramma.
Dit omvat berichten die zowel meldingen als gegevens bevatten (en alle berichten die worden verzonden vanuit de meldingsconsole). In deze gevallen wordt de melding bezorgd in het systeemvak van het apparaat en wordt de gegevensbelasting geleverd in de extra's van de intentie van uw opstartactiviteit.
Hier een korte samenvatting:
App-status | Kennisgeving | Gegevens | Beide |
---|---|---|---|
Voorgrond | onMessageReceived | onMessageReceived | onMessageReceived |
Achtergrond | Systeemvak | onMessageReceived | Kennisgeving: systeemvak |
Data: extra's van de intentie. |
Abonneer je op een onderwerp
Client-apps kunnen zich abonneren op elk bestaand onderwerp of ze kunnen een nieuw onderwerp maken. Wanneer een client-app zich abonneert op een nieuwe onderwerpnaam, wordt een nieuw onderwerp met die naam gemaakt in FCM en kan elke client zich daarop abonneren.
Gebruik de methode subscribeToTopic()
om de onderwerpnaam op te geven:
FirebaseMessaging.getInstance().subscribeToTopic("myTopic");