How can I send a notification from one user to another using Android (I'm using firebase database).
I have a student user when he clicks on a button it will send a notification to his Academic advisor.
I've watched a lot of tutorials but all of them are using notificationCompat and noificationManager and I can't specify to which user this notification will be send
Thanks
You can send notification using token..You can get token..
Create android project in android studio
Open the project & Go to >Tools>Firebase>cloud messaging>set up firebase cloud messaging>
connection to your apps firebase>Connect to firebase>Create a new project using email
Add FCM to your app
Note: You need to a gmail address for adding above 3 & 4 . These will automatically configure your gadle don't do anything...
Create a class named FirebaseIDService & paste bellow code ..
public class FirebaseIDService extends FirebaseInstanceIdService {
#Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.e("***refreshedToken",refreshedToken);
}
}
In Manifest file you add
<service android:name=".FirebaseIDService" android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
You will get a toke like bellow error log
***refreshedToken: eroNxVsruNk:APA91bF5gSK4Hlt-x-Pc2ecw0D8vMHoXwdZ-JY9SSl4KNLV_wUjA76T0Icv6Cxgf8pX9eDPMT3i3UhdxY27CxcvvKX5p6wHEBaX36wvE3kGapTI3uytUCQuBfh56Ss0y419kmBklew-7
Now you will send message using this token.. to the specific device because this token generated for installing apps that means if you install this app yow will get a unique token & if your friend install same app your friend will get the toke. so you will get another unique token and preserved it .. & though these tokens you can send the message...i think will work..
Related
I want to send custom data through Additional Options fields using Firebase Cloud Messaging dashboard to my Android client. Then using those data I'll create a custom notification layout and notify my client manually.
I tried doing that using my custom notification functions. Sometimes it works. But sometimes it shows firebase notification...
So is there any ways to disable that Firebase one and show a new one after configuring manually on the client side?
I think I found it,
Adding,
android:exported="false"
to my service data in AndroidManifest file worked for me.
<service
android:name=".XXXXXXXCloudMessagingSerivce"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
You can send Data messages in order to show custom notification. Have a look at Message types
I'm trying to implement remote notifications in my Xamarin Android project. I followed step-by-step directions found in various guides but the OnTokenRefresh method is never called, even the first time, so it looks like my app does not receive any kind of token or even does not make any type of firebase registration.
I have added Firebase to my Android app and downloaded google-services.json
I included google-services.json in my Xamarin Android Project and set the Build Action to GoogleServicesJson
I inserted this code in AndroidManifest.xml
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
android:exported="false" />
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
I created a class that extends FirebaseInstanceIdService
[Service]
[IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
class FirebaseRegistrationService : FirebaseInstanceIdService
{
const string TAG = "FirebaseRegistrationService";
public override void OnTokenRefresh()
{
var refreshedToken = FirebaseInstanceId.Instance.Token;
System.Diagnostics.Debug.WriteLine(TAG, "Refreshed token: " + refreshedToken);
MainActivity.CurrentActivity.RunOnUiThread(() => RegisterDeviceOnServer(refreshedToken));
}
public void RegisterDeviceOnServer(string refreshedToken)
{
// Custom implementation
}
}
As I have already said OnTokenRefresh is never called.
What I can not understand is: who does the Firebase registration to receive a valid token?
Is there a missing directive?
Is there a missing method that makes this registration?
Why OnTokenRefresh is never called?
You should start the service in your Activity like this :
var intent = new Intent(this, typeof(FirebaseRegistrationService));
StartService(intent);
Also clean the solution once and run the app again. There is a bug in firebase for xamarin.
According to this document, (see section titled: Implement the Firebase Instance ID Service) OnTokenRefresh is only called under a few circumstances:
When the app is installed or uninstalled.
When the user deletes app data.
When the app erases the Instance ID.
When the security of the token has been compromised.
In order to trigger OnTokenRefresh, you should first uninstall the app from the device. Then when you reinstall the app and open it for the first time, OnTokenRefresh will be called.
You can avoid cleaning the solution every time by disabling
Preserve application data cache on device between deploys
under
Tools -> Options -> Xamarin -> Android Settings in VS2017 Enterprise.
This made OnTokenRefresh to be called after every redeploy.
if you are using emulator make sure you install google apps as it depends on google play services package exist in your device
if you are using Genymotion you can press install Gapps
I just updated GCM to FCM according to this guide here. The site says my service which extends FirebaseInstanceIdService will be called as soon as the token is generated. For some reason, my service is never called and onTokenRefresh is never executed.
My services are registered like this, according to the guide:
<service android:name=".fcm.FcmService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service android:name=".fcm.InstanceIdService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCEID_EVENT"/>
</intent-filter>
</service>
My service:
public class InstanceIdService extends FirebaseInstanceIdService {
private static final String TAG = "InstanceIdService";
#Override
public void onTokenRefresh() {
String token = FirebaseInstanceId.getInstance().getToken();
Log.e(TAG, "Got token: " + token);
}
}
The LogCat doesn't say anything about missing configuration files or else, and I can see logs about FirebaseApp and a Log entry mentioning the token, but still my service is never called.
Do I need to start this service somewhere in my activity?
Am I doing something wrong? Can someone guide me in the correct direction?
EDIT: using Log.e("TOKEN", "Token: " + FirebaseInstanceId.getInstance().getToken()); correctly prints my token, so that means it was generated successfully. The service still doesn't get called...
EDIT 2: Changing INSTANCEID_EVENT to INSTANCE_ID_EVENT fixed the issue, although I had to reinstall the app. As I already released a beta version containing the new FCM, my beta testers won't be able to subscribe to the topics to reveice incoming messages. So how should I solve that?
Thanks Endanke for figuring this out with me. It seems that the Firebase documentation is inconsistent. One page says your intent filter in your manifest file should be INSTANCE_ID_EVENT, and another says INSTANCEID_EVENT.
You should use INSTANCE_ID_EVENT, and once you make the change, you'll need to completely uninstall and reinstall your app for the changes to kick in.
FCM should be used as a replacement to GCM. In your case it looks like you have services for both FCM and GCM in your manifest. Try remove the gcm.GcmService, and only use the one that extends FirebaseInstanceId.
Make Sure that your Firebase "MyFirebaseInstanceIDService.java" file is directly under the package name tree "com.company"
Don't put them in the separate subpackage like "com.company.services". This is because your google-services.json will look for the files directly under "com.company" directory.
Add the following in your manifest application tag below meta tag (if any)
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
You will get your TOKEN on the public void onTokenRefresh() method
PS: Download and replace the latest google-services.json from your project console.
After a ton of trial and error my issue was having tools:node="replace" in my application tag...removing it solved the issue for me
I had the same problem and by uninstalling and reinstalling the app on the device onTokenRefresh() got called once. So I guess it changed from GCM where it got called often to just getting called once when there actually is no token.
I've different build variants in my project and I've the following problem:
From: https://firebase.google.com/docs/android/setup#prerequisites
Note: If you have multiple build variants with different package names defined, each app must be added to your project in Firebase console.
Also, check the date of your phone! I once had a difference of 5-7 days! Fixing the day and reinstalling the app fixed this!
What 'Firebase Cloud Messaging' wants is:
Implement a derived class (MyFirebaseInstanceIdService) from
FirebaseInstanceIdService.
Implement the override onTokenRefresh to handle an update on the
token for the device.
In the AndroidManifest.xml reference the 'derived' class prefixed
with a ".".
MyFirebaseInstanceIdService is a 'suggested' name. I personally prefer to prefix such derived classes with an acronym or name that I use throughout the App.
onTokenRefresh() will call only one time.when your app is install first time, if you want to access token from other activity you have to call this method:
FirebaseInstanceId.getInstanceId().getToken();
just change the INSTANCE_ID_EVENT to INSTANCEID_EVENT .it worked for me
I have 2 GCM BroadcastReceivers in my application (One for an android library integrated in my application and one for my own application).
Both of them are registered in the manifest and have the same category (Which is my application package name).
Both have registration with register() function and both receives different valid registrationId's (because the senderId for both are different).
My problem is that I have everything work fine (Both Recievers get the push notification) but after a couple of hours when trying to send a push from Server I encounter "NotRegistered" issue in my server (android library regId) and registrationId seems invalid all of a sudden.
So my question is can I have 2 different GCM "Mechanism" in the same application with different senderId without a collision or some sort on GCM Servers ?
In that case, It will never create collision as both will work as different applications (Both is having different SENDER_ID).
Check the following notes :
1) Make sure that you have added different category name (With INTENT-FILTER) for both library and application :
<receiver
android:name=".xxxxx"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.xxxx" />
</intent-filter>
</receiver>
2) Sometimes the Reg Id is getting changed automatically so try to save the previous one and check each time if it is same, if not then you have to update new one with your server.
UPDATE :
When you send a message, you specify a registration ID, which is implicitly linked to the package name of the app and device where it was generated. Only the app which requested the registration ID will receive your message. So it will conflict because you are using the same library (Same Package name) with different applications.
So your solution might be to do all stuff related to GCM in SingleToneClass with library. In which you will pass your application package name to register with GCM. So whenever you will use your library with different applications, It will refer different package name and SENDER_ID will be the same but it will not cause problem as package name will be changed.
I am trying to implement Fiksu SDK for Android and iOS.
I am able to add code to track registration and purchase :
FiksuTrackingManager.uploadRegistration(Context, FiksuTrackingManager.RegistrationEvent.EVENT1);
FiksuTrackingManager.uploadPurchase(Context, FiksuTrackingManager.PurchaseEvent.EVENT1, 0, "USD");
In iOS i am able to get the logs in the console, but in android i am only getting logs which event is called.How can i check the logs in Android ?
Also how to track the app events in Fiksu dashboard ?
They have also mentioned to add client id , from where will i get the client id ?
if any one has implemented it please guide me how to proceed ?
this might be too late but it may help someone that comes across this post.
I just had to integrate the Fiksu SDK for android for a client and face similar issues when testing.
How can i check the logs in Android ?
If the SDK has been properly installed you should be able to see some logs like below which means the events have been succesfully sent to their server.
11-25 10:04:31.010 21588-23132/ D/FiksuTracking? Event: Resume
11-25 10:04:32.320 21588-23132/ D/FiksuTracking? Successfully uploaded tracking information.
11-25 10:05:40.500 21588-23383/ D/FiksuTracking? Event: Purchase
11-25 10:05:42.180 21588-23383/ D/FiksuTracking? Successfully uploaded tracking information.
how to track the app events in Fiksu dashboard ?
This part is quite annoying as they don't have a way to create Apps in the dashboard and link them to your android app so you can see your events coming through. Instead you have to actually perform the test and send them an email for someone from Fiksu to check their servers and track your events.
These are the test steps as per their documentation:
Download and install your application on an Android device and perform your tests.
Fill a form they have and send it via email to their support team.
Someone will get back to you confirming if they have received your events.
They have also mentioned to add client id , from where will i get the client id ?
The clientId is just an identifier for your users within your app. In other words you can set that to whatever you want (e.i. email address). The suggestion is to set this after a user has registered or logged in in your app.
FiksuTrackingManager.setClientId(Context, "XXX");
Based on their documentation: "Where XXX would be the ID you want to send and can be any alphanumeric string up to 64 characters long. All events sent after this call is made would send the Client ID that has been set. If you call setClientID again it will overwrite whatever was there before. However the first Client ID sent with an event will be the Client ID that is in the export on the Fiksu Client Dashboard and it will not get updated."
if any one has implemented it please guide me how to proceed ?
So to sum up below are the steps to integrate the Fiksu SDK for android.
Downlaod the SDK.
Add the SDK jar to your project.
Set the isntall receiver (Only if you want to track app installs). NOTE that they expect to be the only receiver in the AndroidManifest.xml file. If you are using other third party SDKs to track the same you either:
Use fiksu to forward the intent:
<receiver android:name="com.fiksu.asotracking.InstallTracking"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
<!-- Forward to other receivers -->
<meta-data android:name="forward.1"
android:value="com.google.android.apps.analytics.AnalyticsReceiver" />
<meta-data android:name="forward.2" android:value="com.mypackage.thirdparty.MdotmReceiver" />
</receiver>
Or set the below flag in your AndroidManifest and have another install receiver forward it to the fiksu SDK.
<meta-data android:name="FiksuDisableReceiverCheck" android:value="true" />
Set the permissions in your AndroidManifest.
android.permission.INTERNET
android.permission.READ_PHONE_STATE
Initialize the SDK. Normally on your Application onCreate() method.
FiksuTrackingManager.initialize(this);
Setting up Google Play Services on your project.