【问题标题】:how to get the Context Inside the FirebaseMessagingService?如何获取 FirebaseMessagingService 中的上下文?
【发布时间】:2018-10-10 09:42:45
【问题描述】:

我有一个应用程序,它使用 FCM 发送和接收消息。我已经按照文档中的建议实施了每一件事。

现在在生成令牌时,我想将其保存到共享首选项中。但它给出了错误。

考虑类的名字是这样的

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) {

    }
}}

我真的很想在这个服务中将令牌保存到我的应用程序中。请告诉我为什么我无法获得参考/上下文?

更新:我的 CustomSharedPrefernces 是一个将数据保存到 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);
}}

更新:

错误:“CustomSharedPreferences 中的 android.content.context 无法应用于 com.myprojectname.MyFireBaseMsgAndTokenService”

【问题讨论】:

  • 您遇到了什么具体错误?发布日志。
  • FirebaseMessagingService 扩展了 EnhancedIntentService,然后扩展了服务。使用this 应该可以。如果没有,请输入 context 并检查您的自动完成
  • 发布CustomSharedPreferences的sn-p。
  • @Jay 发布.......
  • 你的代码对我来说编译得很好。检查您的导入,是CustomSharedPreferences.java 中的import android.content.Context; 吗?该错误到底显示在哪里?你试过用Build>Clean Project吗?你的gradle同步了吗?你用的是什么版本的com.google.firebase:firebase-messaging:??

标签: android android-activity


【解决方案1】:

您可以在此处查看我的 Firebase 通知处理:

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

您可以简单地使用thisgetApplicationContext() 来获取上下文

【讨论】:

  • 它给了我错误提示“CustomSharedPreferences 中的 android.content.context 不能应用于 com.myprojectname.MyFireBaseMsgAndTokenService”
  • 我刚刚看到您使用的是旧 Firebase 版本,请查看我更新的答案。
  • 这是不可行的,我没有使用旧的 fcm
  • @Androidteem 检查这个stackoverflow.com/questions/51834864/…
  • 完全一样,但我不知道为什么会出现这个错误,请参阅更新的答案
【解决方案2】:

对我来说,我刚刚将我的 Firebase Messaging 升级到了最新版本(在撰写本文时为 20.2.0)。

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

然后不知何故突然我又可以通过this了。

【讨论】:

    【解决方案3】:
    FirebaseMessagingService extends Service 
    

    Service extends ContextWrapper
    

    ContextWrapper extends Context
    

    所以它也是Context,所以使用MyFirebaseMessagingService.this 或简单地使用this

    【讨论】:

    • 与 OP 有同样的问题,对我来说,它说 FirebaseMessagingService extends com.google.firebase.iid.zzb which extends Object :/
    • 我们找到解决办法了吗?
    • 有什么解决办法吗?
    • 我也是这种情况,有人有解决办法吗?
    【解决方案4】:

    添加以下代码,这是您的 CustomSharedPreferences 类。

    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, "");
        }
    }
    

    然后在 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);
    }
    

    不要在 FirebaseMessagingService 类中初始化您的 CustomSharedPreferences,它可能会对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 2023-03-10
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 2015-01-01
      • 2015-12-30
      • 1970-01-01
      相关资源
      最近更新 更多