Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
As notificações por push permitem que os clientes sejam notificados sobre mensagens recebidas e outras operações que ocorrem em um thread de bate-papo quando o aplicativo móvel não está sendo executado em primeiro plano. Os Serviços de Comunicação do Azure dão suporte a uma lista de eventos que você pode assinar.
Observação
As notificações push de chat são suportadas para Android SDK em versões a partir de 1.1.0-beta.4 e 1.1.0. Recomendamos que você use a versão 2.0.0 ou mais recente, pois as versões mais antigas têm um problema conhecido com a renovação do registro. As etapas de 8 a 12 só são necessárias para versões iguais ou superiores a 2.0.0.
Configure o Firebase Cloud Messaging para o projeto ChatQuickstart. Conclua as etapas
Create a Firebase project,Register your app with Firebase,Add a Firebase configuration file,Add Firebase SDKs to your appeEdit your app manifestna documentação do Firebase.Crie um Hub de Notificação dentro da mesma assinatura que o recurso dos Serviços de Comunicação, configure as configurações do Firebase Cloud Messaging para o hub e vincule o Hub de Notificação ao recurso dos Serviços de Comunicação. Consulte Provisionamento do Hub de Notificação.
Crie um novo arquivo chamado
MyFirebaseMessagingService.javano mesmo diretório ondeMainActivity.javareside. Copie o seguinte código paraMyFirebaseMessagingService.java. Você precisa substituir<your_package_name>pelo nome do pacote usado emMainActivity.java. Você pode usar seu próprio valor para<your_intent_name>. Use esse valor na etapa 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); } }Na parte superior do arquivo
MainActivity.java, adicione as seguintes instruções de importação: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;Adicione o seguinte código à
MainActivityclasse: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); } }); } }); }Atualize a função
onCreateemMainActivity.@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LocalBroadcastManager .getInstance(this) .registerReceiver( firebaseMessagingReceiver, new IntentFilter("<your_intent_name>")); }Coloque o seguinte código após o comentário
<RECEIVE CHAT MESSAGES>emMainActivity:
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
});
- Adicione o
xmlns:toolscampo aoAndroidManifest.xmlficheiro:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.azure.android.communication.chat.sampleapp">
- Desative o inicializador padrão para
WorkManageremAndroidManifest.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 -->
- Adicione a
WorkManagerdependência ao seubuild.gradleficheiro:
def work_version = "2.7.1"
implementation "androidx.work:work-runtime:$work_version"
- Adicione um inicializador personalizado
WorkManagercriando uma classe implementandoConfiguration.Provider:
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();
}
}
Explicação do código anterior: O inicializador padrão do WorkManager está desativado na etapa 9. Esta etapa implementa Configuration.Provider para fornecer um WorkFactory personalizado, que é responsável por criar WorkerManager durante o tempo de execução.
Se o aplicativo estiver integrado ao Azure Function, inicialize os parâmetros do aplicativo no método onCreate(). O método getWorkManagerConfiguration() é chamado quando o aplicativo está iniciando, antes que qualquer atividade, serviço ou objetos recetores (excluindo provedores de conteúdo) sejam criados, para que os parâmetros do aplicativo possam ser inicializados antes do uso. Para obter mais detalhes, consulte o aplicativo de bate-papo de exemplo.
- Adicione o
android:name=.MyAppConfigurationcampo, que usa o nome da classe da etapa 11, emAndroidManifest.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"
>