'how to get the Context Inside the FirebaseMessagingService?

I have an app and It Uses FCM for sending and receiving messages. I have implemented every thing as suggested in docs.

Now on generation of token I want to save that into the Shared Preferrences. but it is giving error on that .

Consider the name of class is like

public class MyFirebaseMsgAndTokenService extends FirebaseMessagingService {

private static final String TAG = "C_MyFirebaseIIDService";

@Override
public void onNewToken(String newToken) {
    super.onNewToken(newToken);
    Log.d(TAG, "Refreshed token: " + newToken);
    CustomSharedPreferences customSharedPreferences = new CustomSharedPreferences(this); // giving error on this
    String oldToken = customSharedPreferences.getStringData(FCM_GENERATED_TOKEN);
    sendRegistrationToServer(newToken,oldToken);
}

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    try {

    } catch (Exception e) {

    }
}}

I really want to save the token into my app here in this service. Please tell me why I am not able to get the reference/Context ?

update: My CustomSharedPrefernces is a class which is saving data in to sharedPrefernces

public class CustomSharedPreferences {

public static final String FCM_GENERATED_TOKEN = "FCM_GENERATED_TOKEN";


private static CustomSharedPreferences mCustomSharedPreferences;
private final SharedPreferences sharedPreferences;

public static CustomSharedPreferences getInstance(Context context) {
    if (mCustomSharedPreferences == null) {
        mCustomSharedPreferences = new CustomSharedPreferences(context);
    }
    return mCustomSharedPreferences;
}


public CustomSharedPreferences(Context context) {
    sharedPreferences = context.getSharedPreferences("myApp", Context.MODE_PRIVATE);
}}

Update:

error: "android.content.context in CustomSharedPreferences can not be applied to com.myprojectname.MyFireBaseMsgAndTokenService"



Solution 1:[1]

You can see my firebase notification handling here:

enter image description here

public UserPreferences(Context context) {
        this.context = context;
        preferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
    }

You can use simply use this orgetApplicationContext() to get the context

Solution 2:[2]

For me, I just upgraded my Firebase Messaging to the latest (which during this time of writing 20.2.0).

implementation 'com.google.firebase:firebase-messaging:20.2.0'

Then somehow suddenly I can pass this again.

Solution 3:[3]

FirebaseMessagingService extends Service 

and

Service extends ContextWrapper

and

ContextWrapper extends Context

so it is a Context as well, so use MyFirebaseMessagingService.this or simply this.

Solution 4:[4]

Add the following code, here is your CustomSharedPreferences class.

public class SharedHelper
 {
    public static SharedPreferences sharedPreferences;
    public static SharedPreferences.Editor editor;
    public static void putKey(Context context, String Key, String Value) {
        sharedPreferences = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
        editor = sharedPreferences.edit();
        editor.putString(Key, Value);
        editor.apply();

    }

    public static String getKey(Context context, String Key) {
        sharedPreferences = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
        return sharedPreferences.getString(Key, "");
    }
}

after that add following code add in FirebaseMessagingService.class

    @Override
public void onNewToken(String s) {
    super.onNewToken(s);

    @SuppressLint("HardwareIds")
    String deviceId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);

    Log.d("DEVICE_ID: " , deviceId);
    Log.d("FCM_TOKEN",s);

    SharedHelper.putKey(this, "device_token", s);
    SharedHelper.putKey(this, "device_id", deviceId);
}

don't initialize your CustomSharedPreferences inside FirebaseMessagingService class it may help you.

Solution 5:[5]

If someone is still struggling with this problem, here is the solution:

To be able to get the context inside any Service you should do that in onCreate method, otherwise you'll face the NullPointerException

@Override
public void onCreate() {
    super.onCreate();
    context = this;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Fadils
Solution 3 deHaar
Solution 4 Ram Suthakar
Solution 5 Ion