Povolit nabízená oznámení
Nabízená oznámení umožňují klientům dostávat oznámení o příchozích zprávách a dalších operacích v chatovacím vlákně v situacích, kdy mobilní aplikace není spuštěná v popředí. Azure Communication Services podporuje seznam událostí, ke kterým se můžete přihlásit.
Poznámka:
Nabízená oznámení chatu jsou podporována pro Sadu Android SDK ve verzích od verze 1.1.0-beta.4 a 1.1.0. Doporučujeme používat verzi 2.0.0 nebo novější, protože starší verze mají známý problém s prodloužením registrace. Kroky od 8 do 12 jsou potřeba pouze pro verze rovnající se nebo větší než 2.0.0.
Nastavte službu Firebase Cloud Messaging pro projekt ChatQuickstart. Proveďte kroky
Create a Firebase project
, ,Register your app with Firebase
Add a Firebase configuration file
,Add Firebase SDKs to your app
aEdit your app manifest
v dokumentaci Firebase.Vytvořte centrum oznámení ve stejném předplatném jako prostředek služby Communication Services, nakonfigurujte nastavení služby Firebase Cloud Messaging pro centrum a propojte centrum oznámení s prostředkem služby Communication Services. Viz zřizování centra oznámení.
Vytvořte nový soubor volaný
MyFirebaseMessagingService.java
ve stejném adresáři, ve kterémMainActivity.java
se nachází. Zkopírujte následující kód doMyFirebaseMessagingService.java
souboru . Budete muset nahradit<your_package_name>
názvem balíčku použitým vMainActivity.java
souboru . Můžete použít vlastní hodnotu pro<your_intent_name>
. Tato hodnota se použije v kroku 6 níže.package <your_package_name>; import android.content.Intent; import android.util.Log; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import com.azure.android.communication.chat.models.ChatPushNotification; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; import java.util.concurrent.Semaphore; public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "MyFirebaseMsgService"; public static Semaphore initCompleted = new Semaphore(1); @Override public void onMessageReceived(RemoteMessage remoteMessage) { try { Log.d(TAG, "Incoming push notification."); initCompleted.acquire(); if (remoteMessage.getData().size() > 0) { ChatPushNotification chatPushNotification = new ChatPushNotification().setPayload(remoteMessage.getData()); sendPushNotificationToActivity(chatPushNotification); } initCompleted.release(); } catch (InterruptedException e) { Log.e(TAG, "Error receiving push notification."); } } private void sendPushNotificationToActivity(ChatPushNotification chatPushNotification) { Log.d(TAG, "Passing push notification to Activity: " + chatPushNotification.getPayload()); Intent intent = new Intent("<your_intent_name>"); intent.putExtra("PushNotificationPayload", chatPushNotification); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } }
Na začátek souboru
MainActivity.java
přidejte následující příkazy importu:import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import com.azure.android.communication.chat.models.ChatPushNotification; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.messaging.FirebaseMessaging;
Do třídy přidejte následující kód
MainActivity
:private BroadcastReceiver firebaseMessagingReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { ChatPushNotification pushNotification = (ChatPushNotification) intent.getParcelableExtra("PushNotificationPayload"); Log.d(TAG, "Push Notification received in MainActivity: " + pushNotification.getPayload()); boolean isHandled = chatAsyncClient.handlePushNotification(pushNotification); if (!isHandled) { Log.d(TAG, "No listener registered for incoming push notification!"); } } }; private void startFcmPushNotification() { FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { if (!task.isSuccessful()) { Log.w(TAG, "Fetching FCM registration token failed", task.getException()); return; } // Get new FCM registration token String token = task.getResult(); // Log and toast Log.d(TAG, "Fcm push token generated:" + token); Toast.makeText(MainActivity.this, token, Toast.LENGTH_SHORT).show(); chatAsyncClient.startPushNotifications(token, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) { Log.w(TAG, "Registration failed for push notifications!", throwable); } }); } }); }
Aktualizujte funkci
onCreate
vMainActivity
souboru .@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LocalBroadcastManager .getInstance(this) .registerReceiver( firebaseMessagingReceiver, new IntentFilter("<your_intent_name>")); }
Pod komentář
<RECEIVE CHAT MESSAGES>
MainActivity
vložte následující kód:
startFcmPushNotification();
chatAsyncClient.addPushNotificationHandler(CHAT_MESSAGE_RECEIVED, (ChatEvent payload) -> {
Log.i(TAG, "Push Notification CHAT_MESSAGE_RECEIVED.");
ChatMessageReceivedEvent event = (ChatMessageReceivedEvent) payload;
// You code to handle ChatMessageReceived event
});
xmlns:tools
Přidejte pole doAndroidManifest.xml
souboru:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.azure.android.communication.chat.sampleapp">
- Zakažte výchozí inicializátor pro
WorkManager
:AndroidManifest.xml
<!-- Disable the default initializer of WorkManager so that we could override it in MyAppConfiguration -->
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<!-- If you are using androidx.startup to initialize other components -->
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
<!-- End of Disabling default initializer of WorkManager -->
WorkManager
Přidejte závislost dobuild.gradle
souboru:
def work_version = "2.7.1"
implementation "androidx.work:work-runtime:$work_version"
- Přidání vlastního
WorkManager
inicializátoru vytvořením implementovanéConfiguration.Provider
třídy:
public class MyAppConfiguration extends Application implements Configuration.Provider {
Consumer<Throwable> exceptionHandler = new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) {
Log.i("YOUR_TAG", "Registration failed for push notifications!" + throwable.getMessage());
}
};
@Override
public void onCreate() {
super.onCreate();
// Initialize application parameters here
WorkManager.initialize(getApplicationContext(), getWorkManagerConfiguration());
}
@NonNull
@Override
public Configuration getWorkManagerConfiguration() {
return new Configuration.Builder().
setWorkerFactory(new RegistrationRenewalWorkerFactory(COMMUNICATION_TOKEN_CREDENTIAL, exceptionHandler)).build();
}
}
Vysvětlení výše uvedeného kódu: Výchozí inicializátor WorkManager
byl zakázán v kroku 9. Tento krok implementuje Configuration.Provider
, aby poskytoval přizpůsobenou aplikaci WorkFactory, která je zodpovědná za vytvoření WorkerManager
během běhu.
Pokud je aplikace integrovaná se službou Azure Functions, měla by se inicializace parametrů aplikace přidat v metodě onCreate(). Metoda getWorkManagerConfiguration() se volá při spuštění aplikace před vytvořením jakékoli aktivity, služby nebo objektu příjemce (s výjimkou poskytovatelů obsahu), aby bylo možné před použitím inicializovat parametry aplikace. Další podrobnosti najdete v ukázkové chatovací aplikaci.
android:name=.MyAppConfiguration
Přidejte pole, které používá název třídy z kroku 11, doAndroidManifest.xml
:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/Theme.AppCompat"
android:supportsRtl="true"
android:name=".MyAppConfiguration"
>