推播通知可讓用戶在行動應用程式未在前景執行時,收到關於聊天線程中傳入訊息及其他操作的通知。 Azure 通訊服務支援您可以訂閱的事件清單。
備註
從 1.1.0-beta.4 和 1.1.0 開始,Android SDK 支援聊天推播通知。 建議您使用 2.0.0 版或更新版本,因為舊版有註冊更新的已知問題。 只有等於或大於 2.0.0 的版本才需要 8 到 12 的步驟。
設定 ChatQuickstart 專案的 Firebase 雲端通訊。 完成 Firebase 檔中的步驟
Create a Firebase project、Register your app with Firebase、Add a Firebase configuration file、Add Firebase SDKs to your app和Edit your app manifest。在與通訊服務資源相同的訂用帳戶內建立通知中樞、設定中樞的 Firebase 雲端通訊設定,並將通知中樞連結至您的通訊服務資源。 請參閱 通知中樞布建。
請在
MainActivity.java所在的目錄中新增一個名為MyFirebaseMessagingService.java的新檔案。 將下列程式代碼複製到MyFirebaseMessagingService.java。 您必須將<your_package_name>替換為MainActivity.java中使用的套件名稱。 您可以針對<your_intent_name>使用自己的值。 在步驟 6 中使用此值。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); } }在檔案
MainActivity.java頂端,新增下列 import 語句: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;將下列程式碼新增至
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); } }); } }); }在
MainActivity中更新函式onCreate。@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LocalBroadcastManager .getInstance(this) .registerReceiver( firebaseMessagingReceiver, new IntentFilter("<your_intent_name>")); }將下列程式代碼放在
MainActivity中的註解<RECEIVE CHAT MESSAGES>之後:
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欄位新增至AndroidManifest.xml檔案:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.azure.android.communication.chat.sampleapp">
- 在
AndroidManifest.xml中停用WorkManager的預設初始化器:
<!-- 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相依性新增至您的build.gradle檔案:
def work_version = "2.7.1"
implementation "androidx.work:work-runtime:$work_version"
- 藉由建立一個實作
Configuration.Provider的類別來新增自訂WorkManager初始化子:
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();
}
}
上述程式代碼的說明:在步驟 9 中停用 的預設初始化表達式WorkManager。 此步驟會實作 Configuration.Provider 以提供自定義的 WorkFactory,負責在運行時建立 WorkerManager。
如果應用程式與 Azure Function 整合,請在方法 onCreate()中初始化應用程式參數。 在啟動應用程式時,會在建立任何活動、服務或接收者物件之前呼叫 方法 getWorkManagerConfiguration() (不包括內容提供者),因此可以在使用之前先初始化應用程式參數。 如需詳細資訊,請參閱範例聊天應用程式。
- 將
android:name=.MyAppConfiguration使用步驟 11 類別名稱的欄位新增至AndroidManifest.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"
>