Zelfstudie: Pushmeldingen verzenden naar Android-apparaten met Firebase SDK versie 0.6
In deze zelfstudie wordt gedemonstreerd hoe u met Azure Notification Hubs en de Firebase Cloud Messaging (FCM) SDK versie 0.6 en pushmeldingen verzendt naar een Android-toepassing. In deze zelfstudie gaat u een lege Android-app maken die pushmeldingen ontvangt via Firebase Cloud Messaging (FCM).
U kunt de voltooide code voor deze zelfstudie downloaden op GitHub.
In deze zelfstudie voert u de volgende stappen uit:
- Een Android Studio-project maken.
- Een Firebase-project maken dat Firebase Cloud Messaging ondersteunt.
- Maak een hub.
- Verbind uw app met de hub.
- De app testen.
Vereisten
U hebt een actief Azure-account nodig om deze zelfstudie te voltooien. Als u geen account hebt, kunt u binnen een paar minuten een gratis proefaccount maken. Zie Gratis proefversie van Azure voor meer informatie.
U hebt ook de volgende items nodig:
- De nieuwste versie van Android Studio
- Android 2.3 of hoger voor Firebase Cloud Messaging
- Google Repository revisie 27 of hoger voor Firebase Cloud Messaging
- Google Play-Services 9.0.2 of hoger voor Firebase Cloud Messaging
Het voltooien van deze zelfstudie is een vereiste voor alle andere Notification Hubs-zelfstudies voor Android-apps.
Een Android Studio-project maken
- Start Android Studio.
- Selecteer File, wijs naar New en selecteer New Project.
- Selecteer Empty Activity op de pagina Choose your project en selecteer Next.
- Voer de volgende stappen uit op de pagina Configure your project:
Voer een naam in voor de toepassing.
Geef een locatie op voor het opslaan van de projectbestanden.
Selecteer Finish.

Een Firebase-project maken dat FCM ondersteunt
Meld u aan bij de Firebase-console. Maak een nieuw Firebase-project als u er nog geen hebt.
Nadat u uw project hebt gemaakt, selecteert u Firebase toevoegen aan uw Android-app.

Voer de volgende stappen uit op de pagina Firebase toevoegen aan uw Android-app:
Voor Android-pakketnaam kopieert u de waarde van uw applicationId in het bestand build.gradle van uw toepassing. In dit voorbeeld is het
com.fabrikam.fcmtutorial1app.
Selecteer App registreren.
Selecteer google-services.json downloaden, sla het bestand op in de map app van uw project, en selecteer Volgende.

Breng de volgende configuratiewijzigingen aan in uw project in Android Studio.
Voeg in het bestand build.gradle op projectniveau (<project>/build.gradle) de volgende instructie toe aan de sectie dependencies (afhankelijkheden).
classpath 'com.google.gms:google-services:4.0.1'Voeg in het bestand build.gradle op app-niveau (<project>/<app-module>/build.gradle) de volgende instructies toe aan de sectie dependencies (afhankelijkheden).
implementation 'com.google.firebase:firebase-core:16.0.8' implementation 'com.google.firebase:firebase-messaging:17.3.4'Voeg de volgende regel toe aan het einde van het build.gradle-bestand op app-niveau na de sectie met afhankelijkheden.
apply plugin: 'com.google.gms.google-services'Selecteer Nu synchroniseren op de werkbalk.

Selecteer Next.
Selecteer Deze stap overslaan.

Selecteer in de Firebase-console het tandwiel van uw project. Selecteer vervolgens Projectinstellingen.

Als u het bestand google-services.json niet hebt gedownload in de map app van uw Android Studio-project, kunt u dat op deze pagina doen.
Ga naar Cloud Messaging bovenaan op het tabblad.
Kopieer de Serversleutel en sla deze op voor later gebruik. U gebruikt deze waarde om uw hub te configureren.
Een hub configureren
Meld u aan bij de Azure-portal.
Selecteer Alle services in het menu aan de linkerkant en selecteer Notification Hubs in de sectie Mobiel. Selecteer het sterpictogram naast de servicenaam om de service toe te voegen aan de sectie FAVORIETEN in het menu aan de linkerkant. Nadat u Notification Hubs hebt toegevoegd aan FAVORIETEN, selecteert u dit in het linkermenu.

Selecteer op Notification Hubs pagina Maken op de werkbalk.

Ga als volgt te werk op het tabblad Basisinformatie op de pagina Notification Hub:
Selecteer in Abonnement de naam van het Azure-abonnement dat u wilt gebruiken en selecteer vervolgens een bestaande resourcegroep of maak een nieuw abonnement.
Voer een unieke naam in voor de nieuwe naamruimte in Naamruimtedetails.
Een naamruimte bevat een of meer Notification Hubs, dus typ een naam voor de hub in Details van Notification Hub. Of selecteer een bestaande naamruimte in de vervolgkeuzekeuze.
Selecteer een waarde in de vervolgkeuzelijst Locatie. Deze waarde specificeert de locatie waar u de hub wilt maken.
Selecteer Maken.

Selecteer Meldingen (het belpictogram) en selecteer vervolgens Ga naar resource. U kunt ook de lijst op de pagina Notification Hubs vernieuwen en uw hub selecteren.

Selecteer Toegangsbeleid in de lijst. U ziet dat de twee verbindingsreeksen voor u beschikbaar zijn. Later moet u er pushmeldingen mee afhandelen.
Belangrijk
Gebruik niet het beleid DefaultFullSharedAccessSignature in uw toepassing. Deze mag alleen in uw back-end worden gebruikt.

Firebase Cloud Messaging-instellingen voor de hub configureren
Selecteer in het linkerdeelvenster onder Instellingen de optie Google (GCM/FCM) .
Voer de serversleutel in voor het FCM-project dat u eerder hebt opgeslagen.
Selecteer Opslaan op de werkbalk.

De Azure-portal geeft een bericht weer in de waarschuwingen dat de hub is bijgewerkt. De knop Opslaan kan niet worden gekozen.
Uw hub is nu geconfigureerd om te werken met Firebase Cloud Messaging. U hebt ook de verbindingsreeksen die nodig zijn om meldingen naar een apparaat te verzenden en een app te registreren voor het ontvangen van meldingen.
Uw app verbinden met de Notification Hub
Google Play-services aan het project toevoegen
Selecteer in Android Studio in het menu de optie Hulpprogramma’s, en selecteer vervolgens SDK Manager.
Selecteer de doelversie van de Android SDK die wordt gebruikt in het project. Selecteer vervolgens Pakketdetails weergeven.

Selecteer Google API’s als dit nog niet is geïnstalleerd.

Schakel over naar het tabblad SDK-hulpprogramma's . Als u Google Play Service nog niet hebt geïnstalleerd, selecteert u Google Play Services zoals wordt weergegeven in de onderstaande afbeelding. Selecteer vervolgens Toepassen om de installatie te starten. Noteer het SDK-pad om het in een later stadium te kunnen gebruiken.

Klik op OK zodra het dialoogvenster Wijziging bevestigen wordt weergegeven. De vereiste onderdelen worden geïnstalleerd met behulp van het installatieprogramma voor onderdelen. Selecteer Voltooien zodra de onderdelen zijn geïnstalleerd.
Selecteer OK om het dialoogvenster Instellingen voor nieuwe projecten te sluiten.
Open het bestand AndroidManifest.xml en voeg de volgende code toe aan de tag toepassing.
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
Azure Notification Hubs-bibliotheken toevoegen
Voeg in het bestand Build.Gradle voor de app de volgende regels toe in het gedeelte met afhankelijkheden.
implementation 'com.microsoft.azure:notification-hubs-android-sdk:0.6@aar'Voeg de volgende opslagplaats toe na het gedeelte met afhankelijkheden.
repositories { maven { url "https://dl.bintray.com/microsoftazuremobile/SDK" } }
Ondersteuning voor Google Firebase toevoegen
Voeg in het bestand Build.Gradle voor de app de volgende regels toe aan het gedeelte afhankelijkheden als die er nog niet staan.
implementation 'com.google.firebase:firebase-core:16.0.8' implementation 'com.google.firebase:firebase-messaging:17.3.4'Voeg de volgende invoegtoepassing toe aan het einde van het bestand als deze er nog niet staat.
apply plugin: 'com.google.gms.google-services'Selecteer Nu synchroniseren op de werkbalk.
Het bestand AndroidManifest.xml bijwerken
Nadat u uw FCM-registratietoken hebt ontvangen, gebruikt u dit om te registreren bij Azure Notification Hubs. U ondersteunt deze registratie op de achtergrond met een
IntentServicemet de naamRegistrationIntentService. Met deze service wordt ook uw FCM-registratietoken vernieuwd. U maakt ook een klasse met de naamFirebaseServiceals subklasse vanFirebaseMessagingServiceen overschrijft deonMessageReceived-methode om meldingen te ontvangen en af te handelen.Voeg de volgende servicedefinitie toe aan het bestand AndroidManifest.xml in de
<application>-tag.<service android:name=".RegistrationIntentService" android:exported="false"> </service> <service android:name=".FirebaseService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>Voeg de volgende vereiste FCM-gerelateerde machtigingen toe onder de tag
</application>.<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
Code toevoegen
Vouw in de Project-weergave app > src > main > java uit. Klik met de rechtermuisknop op de pakketmap onder java, selecteer Nieuw en selecteer vervolgens Java-klasse. Voer NotificationSettings in voor de naam en selecteer vervolgens OK.
Zorg ervoor dat u de volgende drie tijdelijke aanduidingen in de volgende code bijwerkt voor de klasse
NotificationSettings:HubListenConnectionString: De verbindingsreeks DefaultListenAccessSignature voor de hub. Kopieer deze verbindingsreeks door te klikken op Toegangsbeleid in uw hub in de Azure-portal.
HubName: Gebruik de naam van uw hub die wordt weergegeven op de hubpagina in de Azure-portal.
NotificationSettings-code:public class NotificationSettings { public static String HubName = "<Your HubName>"; public static String HubListenConnectionString = "<Enter your DefaultListenSharedAccessSignature connection string>"; }Belangrijk
Voer de naam en de DefaultListenSharedAccessSignature van uw hub voordat u verdergaat.
Voeg een andere nieuwe klasse toe aan uw project met de naam
RegistrationIntentService. Met deze klasse wordt deIntentService-interface geïmplementeerd. Deze zorgt ook voor het vernieuwen van het GCM-token en de registratie bij de Notification Hub.Gebruik de volgende code voor deze klasse.
import android.app.IntentService; import android.content.Intent; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Log; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; import com.microsoft.windowsazure.messaging.NotificationHub; import java.util.concurrent.TimeUnit; public class RegistrationIntentService extends IntentService { private static final String TAG = "RegIntentService"; String FCM_token = null; private NotificationHub hub; public RegistrationIntentService() { super(TAG); } @Override protected void onHandleIntent(Intent intent) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); String resultString = null; String regID = null; String storedToken = null; try { FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { FCM_token = instanceIdResult.getToken(); Log.d(TAG, "FCM Registration Token: " + FCM_token); } }); TimeUnit.SECONDS.sleep(1); // Storing the registration ID that indicates whether the generated token has been // sent to your server. If it is not stored, send the token to your server. // Otherwise, your server should have already received the token. if (((regID=sharedPreferences.getString("registrationID", null)) == null)){ NotificationHub hub = new NotificationHub(NotificationSettings.HubName, NotificationSettings.HubListenConnectionString, this); Log.d(TAG, "Attempting a new registration with NH using FCM token : " + FCM_token); regID = hub.register(FCM_token).getRegistrationId(); // If you want to use tags... // Refer to : https://azure.microsoft.com/documentation/articles/notification-hubs-routing-tag-expressions/ // regID = hub.register(token, "tag1,tag2").getRegistrationId(); resultString = "New NH Registration Successfully - RegId : " + regID; Log.d(TAG, resultString); sharedPreferences.edit().putString("registrationID", regID ).apply(); sharedPreferences.edit().putString("FCMtoken", FCM_token ).apply(); } // Check to see if the token has been compromised and needs refreshing. else if (!(storedToken = sharedPreferences.getString("FCMtoken", "")).equals(FCM_token)) { NotificationHub hub = new NotificationHub(NotificationSettings.HubName, NotificationSettings.HubListenConnectionString, this); Log.d(TAG, "NH Registration refreshing with token : " + FCM_token); regID = hub.register(FCM_token).getRegistrationId(); // If you want to use tags... // Refer to : https://azure.microsoft.com/documentation/articles/notification-hubs-routing-tag-expressions/ // regID = hub.register(token, "tag1,tag2").getRegistrationId(); resultString = "New NH Registration Successfully - RegId : " + regID; Log.d(TAG, resultString); sharedPreferences.edit().putString("registrationID", regID ).apply(); sharedPreferences.edit().putString("FCMtoken", FCM_token ).apply(); } else { resultString = "Previously Registered Successfully - RegId : " + regID; } } catch (Exception e) { Log.e(TAG, resultString="Failed to complete registration", e); // If an exception happens while fetching the new token or updating registration data // on a third-party server, this ensures that we'll attempt the update at a later time. } // Notify UI that registration has completed. if (MainActivity.isVisible) { MainActivity.mainActivity.ToastNotify(resultString); } } }Voeg in de klasse
MainActivityde volgende instructies voorimporttoe boven de klassendeclaratie.import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import android.content.Intent; import android.util.Log; import android.widget.TextView; import android.widget.Toast;Voeg de volgende leden toe bovenaan de klasse. U gebruikt deze velden om de beschikbaarheid van Google Play Services te controleren, zoals aanbevolen door Google.
public static MainActivity mainActivity; public static Boolean isVisible = false; private static final String TAG = "MainActivity"; private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;Voeg in de klasse
MainActivityde volgende methode toe om de beschikbaarheid van Google Play Services te controleren./** * Check the device to make sure it has the Google Play Services APK. If * it doesn't, display a dialog box that enables users to download the APK from * the Google Play Store or enable it in the device's system settings. */ private boolean checkPlayServices() { GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); int resultCode = apiAvailability.isGooglePlayServicesAvailable(this); if (resultCode != ConnectionResult.SUCCESS) { if (apiAvailability.isUserResolvableError(resultCode)) { apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST) .show(); } else { Log.i(TAG, "This device is not supported by Google Play Services."); ToastNotify("This device is not supported by Google Play Services."); finish(); } return false; } return true; }Voeg in de klasse
MainActivityde volgende code toe waarmee Google Play Services wordt gecontroleerd voordat u deIntentServiceaanroept om uw FCM-registratietoken op te halen en te registreren met uw hub:public void registerWithNotificationHubs() { if (checkPlayServices()) { // Start IntentService to register this application with FCM. Intent intent = new Intent(this, RegistrationIntentService.class); startService(intent); } }In de methode
OnCreatevan de klasseMainActivityvoegt u de volgende code toe om het registratieproces te starten wanneer de activiteit wordt gemaakt:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainActivity = this; registerWithNotificationHubs(); FirebaseService.createChannelAndHandleNotifications(getApplicationContext()); }Voeg deze extra methoden toe aan de
MainActivityom de status van de app te controleren en een rapport van de status in uw app op te nemen:@Override protected void onStart() { super.onStart(); isVisible = true; } @Override protected void onPause() { super.onPause(); isVisible = false; } @Override protected void onResume() { super.onResume(); isVisible = true; } @Override protected void onStop() { super.onStop(); isVisible = false; } public void ToastNotify(final String notificationMessage) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, notificationMessage, Toast.LENGTH_LONG).show(); TextView helloText = (TextView) findViewById(R.id.text_hello); helloText.setText(notificationMessage); } }); }Voor de methode
ToastNotifywordt het besturingselement Hallo wereldTextViewgebruikt om de status en kennisgevingen permanent in de app te melden. Voeg in de indeling res > layout > activity_main.xml de volgende id toe voor het besturingselement.android:id="@+id/text_hello"
Vervolgens gaat u een subklasse toevoegen voor de ontvanger die u hebt gedefinieerd in AndroidManifest.xml. Voeg een andere nieuwe klasse toe aan uw project met de naam
FirebaseService.Voeg boven in
FirebaseService.javade volgende importinstructie toe:import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; import android.util.Log; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import androidx.core.app.NotificationCompat;Voeg de volgende code toe voor de klasse
FirebaseService, zodat dit een subklasse vanFirebaseMessagingServicewordt.Deze code overschrijft de methode
onMessageReceived, en rapporteert de ontvangen meldingen. Deze verzendt ook de pushmelding naar Android Notification Manager met de methodesendNotification(). De methodesendNotification()moet worden aangeroepen wanneer de app niet actief is en een melding is ontvangen.public class FirebaseService extends FirebaseMessagingService { private String TAG = "FirebaseService"; public static final String NOTIFICATION_CHANNEL_ID = "nh-demo-channel-id"; public static final String NOTIFICATION_CHANNEL_NAME = "Notification Hubs Demo Channel"; public static final String NOTIFICATION_CHANNEL_DESCRIPTION = "Notification Hubs Demo Channel"; public static final int NOTIFICATION_ID = 1; private NotificationManager mNotificationManager; NotificationCompat.Builder builder; static Context ctx; @Override public void onMessageReceived(RemoteMessage remoteMessage) { // ... // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); String nhMessage; // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); nhMessage = remoteMessage.getNotification().getBody(); } else { nhMessage = remoteMessage.getData().values().iterator().next(); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. if (MainActivity.isVisible) { MainActivity.mainActivity.ToastNotify(nhMessage); } sendNotification(nhMessage); } private void sendNotification(String msg) { Intent intent = new Intent(ctx, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); mNotificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder( ctx, NOTIFICATION_CHANNEL_ID) .setContentText(msg) .setPriority(NotificationCompat.PRIORITY_HIGH) .setSmallIcon(android.R.drawable.ic_popup_reminder) .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL); notificationBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()); } public static void createChannelAndHandleNotifications(Context context) { ctx = context; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel( NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH); channel.setDescription(NOTIFICATION_CHANNEL_DESCRIPTION); channel.setShowBadge(true); NotificationManager notificationManager = context.getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); } } }Klik in Android Studio in de menubalk op Bouwen > Project opnieuw opbouwen om ervoor te zorgen dat uw code geen fouten bevat. Als u een foutbericht ontvangt over het pictogram
ic_launcher, verwijdert u de volgende instructie uit het bestand AndroidManifest.xml:android:icon="@mipmap/ic_launcher"Zorg ervoor dat u een virtueel apparaat hebt voor het uitvoeren van de app. Als u er geen hebt, voegt u er als volgt een toe:
Voer de app uit op uw geselecteerde apparaat en controleer of dat deze correct is geregistreerd in de hub.
Notitie
De registratie kan mislukken bij de eerste keer starten totdat de methode
onTokenRefresh()van de exemplaar-id-service wordt aangeroepen. De vernieuwing moet een succesvolle registratie met de Notification Hub tot stand brengen.
Testen van melding verzenden vanuit de Notification Hub
U kunt pushmeldingen verzenden vanuit de Azure-portal door de volgende stappen uit te voeren:
Ga in de Azure-portal naar de pagina Notification Hub voor uw hub en selecteer Verzenden testen in het gedeelte Probleemoplossing.
Selecteer voor Platforms de optie Android.
Selecteer Verzenden. U ziet nog geen melding op het Android-apparaat omdat u daarop de mobiele app niet hebt uitgevoerd. Nadat u de mobiele app hebt uitgevoerd, selecteert u opnieuw Verzenden om de melding weer te geven.
Bekijk het resultaat van de bewerking in de lijst onderaan.

U ziet de melding op uw apparaat.

Pushmeldingen worden gewoonlijk in een back-endservice zoals Mobile Apps of ASP.NET verzonden met een compatibele bibliotheek. U kunt de REST API ook rechtstreeks gebruiken om meldingsberichten te verzenden als er geen bibliotheek beschikbaar is voor uw back-end.
Hier volgt een lijst met andere zelfstudies die u mogelijk kunt bekijken voor het verzenden van meldingen:
- Azure Mobile Apps: Zie Pushmeldingen toevoegen aan uw iOS-app voor een voorbeeld van hoe u meldingen verzendt vanuit een back-end van Mobile Apps die is geïntegreerd met Notification Hubs.
- ASP.NET: gebruik Notification Hubs om meldingen naar gebruikers te pushen.
- Azure Notification Hub Java SDK: zie How to use Notification Hubs from Java (Notification Hubs gebruiken vanuit Java) voor het verzenden van meldingen vanuit Java. Dit is getest in Eclipse voor Android-ontwikkeling.
- PHP: zie How to use Notification Hubs from PHP (Notification Hubs gebruiken vanuit PHP).
De mobiele app uitvoeren in een emulator
Voordat pushmeldingen binnen een emulator test, moet u ervoor zorgen dat de installatiekopie van de emulator het Google API-niveau ondersteunt dat u voor uw app hebt gekozen. Als uw installatiekopie geen ondersteuning biedt voor native Google-API’s, kan de uitzondering SERVICE_NIET_BESCHIKBAAR worden weergegeven.
Bovendien moet uw Google-account zijn toegevoegd aan de actieve emulator onder Instellingen > Accounts. Anders kunnen pogingen om opnieuw te registreren bij FCM leiden tot de uitzondering VERIFICATIE_MISLUKT.
Volgende stappen
In deze zelfstudie hebt u Firebase Cloud Messaging gebruikt om meldingen te verzenden naar alle Android-apparaten die zijn geregistreerd bij de service. Ga verder met de volgende zelfstudie als u wilt weten hoe u pushmeldingen kunt verzenden naar specifieke apparaten:

