【问题标题】:How can I Get Firebase Token from other classes?如何从其他类获取 Firebase 令牌?
【发布时间】:2021-05-24 08:45:07
【问题描述】:

在制作 Android 应用程序时,我想在同一个包中的不同类(例如 DataManager.java)中使用新的 Firebase 令牌。 但是当我运行 DataManager.java 时,它总是无法获取令牌字符串。

除了将字符串存储到服务器数据库或 SharedPreference 之外,还有其他方法可以获取字符串吗? 任何建议将不胜感激。

DataManager.java

public class DataManager {

public static GCMBroadcastReceiver  _fcm    = null;

public static String registerGoogleServiceInBackground( final OnDataManagerRegisterGooglePlayServiceListener listener )
    {
        boolean isEnabledPlayService = true;
        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable( getContext() );
        {
            if( GooglePlayServicesUtil.isUserRecoverableError( resultCode ) )
    
            {
                GooglePlayServicesUtil.getErrorDialog( resultCode, (Activity) getContext(), PLAY_SERVICES_RESOLUTION_REQUEST ).show();
    
            } else {
                Log.i( "MainActivity.java|checkPlayService", "|This device is not supported.|" );
            }
    
            isEnabledPlayService = false;
        }

        if( isEnabledPlayService )

        {

            if( TextUtils.isEmpty( registrationId ) )
                 {
                        new AsyncTask<Void, Void, String>() {

                        @Override
                        protected String doInBackground( Void... params )
                        {
                            String msg;
                            try {
                                    if( _fcm == null ){
                                            _fcm = new GCMBroadcastReceiver();
                                    Log.d("TEST_FCM", _fcm.getRegId());
                                }
                                    _fcm.onNewToken(GCMBroadcastReceiver.token);
                                    registrationId = _fcm.getRegId();
                            
                                msg = "Device registered, registration ID=" + registrationId;
                                Log.d("Device registered", "|" + registrationId);
                            
                            } catch( Exception ex ) {
                                msg = "Error :" + ex.getMessage();
                            }

                        return msg;

                        }

                        @Override
                        protected void onPostExecute( String msg ){
                        if( listener != null ) listener.onFinish( true, registrationId );
                            Log.i( "MainActivity.java | onPostExecute", "|" + msg + "|" );
                        }
                    }.execute( null, null, null );
                            return "";
                    }
                 } else {
                           if( listener != null ) listener.onFinish( true, registrationId );
                       return registrationId;
                     }
                    } else {
            Log.i( "MainActivity.java | onCreate", "|No valid Google Play Services APK found.|" );
            if( listener != null ) listener.onFinish( true, registrationId );
            return null;
        }
    }
}

GCMBroadcastReceiver.java

public class GCMBroadcastReceiver extends FirebaseMessagingService
{
 public static String   token   = null;
 private static String  registrationId = "123";

 @Override
 public void onNewToken(String token)
 {
  super.onNewToken(token);
  Log.d("FCM_token", token);
  registrationId = token;
 }

 public String getRegId() {
    return registrationId;
 }
}

日志(已编辑)

2021-05-24 16:54:38.013 1767-1866/com.counsring D/TEST_FCM: 123
2021-05-24 16:54:38.652 1767-1767/com.counsring I/MainActivity.java | onPostExecute: |Error :println needs a message|
2021-05-24 16:54:39.869 1767-1923/com.counsring D/FCM_token: foyci6cQA-M:APA91bHafND9btbiSyI9M6UhptfQxe1T9NZM72fKc4ZMhHFPS2bDjdlsWjA99vYkwt3zr3TJZYY4pF1rrfkmpl7hHmZgDn1oKnxC9fJodfwYbXdq2Z3I5XDzwpByjw6F
2021-05-24 16:54:39.869 1767-1923/com.counsring D/RegIdTest: foyci6cQA-M:APA91bHafND9btbiSyI9M6UhptfQxe1T9NZM72fKc4ZMhHFPS2bDjdlsWjA99vYkwt3zr3TJZYY4pF1rrfkmpl7hHmZgDn1oKnxC9fJodfwYbXdq2Z3I5XDzwpByjw6F

【问题讨论】:

  • 你可以在任何你想要的地方获取令牌。在您的班级中使用此代码stackoverflow.com/a/64750801/7436566
  • @OhhhThatVarun 我想获得新的令牌,而不是当前的。
  • 是的,我知道!这将返回新的令牌。
  • 我使用了您在 DataManager 类中建议的代码,而不是 Messaging 类。但我得到一个错误:找不到符号方法 getToken()。我导入了 FirebaseMessaging 和 FirebaseMessagingService。我错过了什么?
  • 很奇怪。我在一个新项目上尝试过,它对我有用。

标签: java android firebase firebase-cloud-messaging


【解决方案1】:

检索当前令牌 FirebaseMessaging.getInstance().getToken();

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

处理新令牌 (在您的消息传递类中)

@Override
public void onNewToken(String token) {
    Log.d(TAG, "Refreshed token: " + token);
}

更多请查看Firebase Docs

【讨论】:

  • 谢谢。但我正在尝试在生成新令牌后立即在其他类中获取新令牌 - 而不是当前令牌。
  • @taki 根据Docs 注册令牌可能会在以下情况下更改:应用程序在新设备上恢复。用户卸载/重新安装应用程序。用户清除应用数据。
猜你喜欢
  • 1970-01-01
  • 2021-09-07
  • 2021-02-02
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2021-08-16
  • 2017-08-21
  • 2018-01-07
相关资源
最近更新 更多