Hello everyone! hope you are doing well .Here is another article on Speak out the notification received from Firebase .Basically we will use Text to Speech Service to achieve this. Before going further lets discuss something about FCM behavior.
There are two types of messages in FCM (Firebase Cloud Messaging):
Display Messages: These messages trigger the onMessageReceived() callback only when your app is in foreground.
Data Messages: Theses messages trigger the onMessageReceived() callback even if your app is in foreground/background/killed.
So we can say that we will not receive data messages from Firebase console when app is in background or killed. To solve this problem we have to send FCM notification using our Server or we can also use Postman for sending notification as a Server.
Here are some steps to follow for send notification using Postman.
- Copy Legacy Server Key from Firebase Console > Project Settings > Cloud Messaging
- In Postman Select POST. Enter request URL as https://fcm.googleapis.com/fcm/send
- Add Headers Authorization: key=<legacy_server_key> OR Authorization: key=<server_key>and Content-Type: application/json.
- Now Select Body > raw > JSON (application/json) and add following code:
{
"to" : "YOUR_FCM_TOKEN_WILL_BE_HERE",
"notification" : {
"body" : "Body of Your Notification",
"title": "Title of Your Notification"
},
"data" : {
"body" : "Body of Your Notification",
"title": "Title of Your Notification",
"message" : "The content here which is about to speak out",
}
}
package com.FCMVoice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; public class FirebaseDataReceiver extends BroadcastReceiver { private final String TAG = "FirebaseDataReceiver"; public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); if (bundle != null) { String msg=bundle.get("message").toString(); try{ if(msg!=null) { Intent speechIntent=new Intent(); speechIntent.putExtra("voicedata",msg); MySpeakService.enqueueWork(context, speechIntent); } } catch (Exception e) { e.printStackTrace(); } } } }
package com.FCMVoice; import android.content.Context; import android.content.Intent; import android.speech.tts.TextToSpeech; import android.util.Log; import androidx.annotation.NonNull; import androidx.core.app.JobIntentService; import java.util.Locale; public class MySpeakService extends JobIntentService { private TextToSpeech mySpeakTextToSpeech = null; private boolean isSafeToDestroy = false; public static void enqueueWork(Context context, Intent intent) { enqueueWork(context, MySpeakService.class, 1, intent); } @Override protected void onHandleWork(@NonNull Intent intent) { final String message = intent.getStringExtra("voicedata"); mySpeakTextToSpeech = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { try { if (mySpeakTextToSpeech != null && status == TextToSpeech.SUCCESS) { Log.d("spoken text",message); mySpeakTextToSpeech.setLanguage(new Locale("hi")); mySpeakTextToSpeech.setPitch(1.0f); mySpeakTextToSpeech.setSpeechRate(1.0f); mySpeakTextToSpeech.speak(message, TextToSpeech.QUEUE_ADD, null); } } catch (Exception ex) { Log.d("Exception spoken text",message); System.out.print("Error handling TextToSpeech GCM notification " + ex.getMessage()); } while (mySpeakTextToSpeech.isSpeaking()) { } isSafeToDestroy = true; } }); } @Override public void onDestroy() { if (isSafeToDestroy) { if (mySpeakTextToSpeech != null) { mySpeakTextToSpeech.shutdown(); } super.onDestroy(); } } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.FCMVoice"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <application android:name="com.FCMVoice.MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name="com.FCMVoice.Splash" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service> <service android:name=".MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <receiver android:name=".FirebaseDataReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter android:directBootAware="true"> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </receiver> <service android:name=".MySpeakService" android:permission="android.permission.BIND_JOB_SERVICE" android:enabled="true" android:exported="true"/> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@mipmap/ic_launcher_round" /> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorPrimaryDark" /> <meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="FCMVoice_01" /> </application> </manifest>
Comments
Post a Comment