java.lang.IllegalArgumentException 在 FirebaseMessaging.getInstance().subscribeToTopic()

java.lang.IllegalArgumentException on FirebaseMessaging.getInstance().subscribeToTopic()

我有一个方法 subscribeToTopic 可以让用户订阅我的应用程序中的某个位置以获取 Firebase 通知。

当位置对应用程序可用时调用此方法(当应用程序启动且位置可用时或收到 LocationCallback 时)。从服务器加载应用程序的必要数据后调用该方法。

应用程序有时会在打开时崩溃,出现以下行。

FirebaseMessaging.getInstance().subscribeToTopic(longPCountry);

我从 PlayStore 的崩溃日志中收到的错误是:

java.lang.IllegalArgumentException: 
  at com.google.firebase.messaging.FirebaseMessaging.subscribeToTopic (Unknown Source:89)
  at packagename.MapsActivity.subscribeToTopic (MapsActivity.java:1734)
  at packagename.MapsActivity.onSuccess (MapsActivity.java:1835)
  at packagename.MapsActivity.onSuccess (MapsActivity.java:1831)
  at com.google.android.gms.tasks.zzj.run (Unknown Source:27)
  at android.os.Handler.handleCallback (Handler.java:789)
  at android.os.Handler.dispatchMessage (Handler.java:98)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6809)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767)

这是我的方法

public void subscribeToTopic(Location location){
        Geocoder geocoder = new Geocoder(context, Locale.getDefault());
        clientLat = location.getLatitude();
        clientLng = location.getLongitude();
        checkCity();
        List<Address> address = new ArrayList<>();
        try {
            address = geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (address.size()>0) {
            String longPCountry = address.get(0).getAdminArea();
            String clientCity = address.get(0).getLocality();
            String defaultVal = "first";
            String lastTopic = getStringPreference(getString(R.string.pnTopicSubFile),getString(R.string.pnTopicSub),defaultVal);
            if (longPCountry!=null) {
                if (!longPCountry.equals(lastTopic)) {
                    FirebaseMessaging.getInstance().subscribeToTopic(longPCountry);
                    putStringPreference(getString(R.string.pnTopicSubFile),getString(R.string.pnTopicSub),longPCountry);
                    if (!lastTopic.equals("first")){
                        FirebaseMessaging.getInstance().unsubscribeFromTopic(lastTopic);
                    }
                }
            }
            String lastCity = getStringPreference(getString(R.string.pnTopicCityFile),getString(R.string.pnTopicCity),defaultVal);
            if (clientCity!=null){
                if (!clientCity.equals(lastCity)){
                    FirebaseMessaging.getInstance().subscribeToTopic(clientCity);
                    putStringPreference(getString(R.string.pnTopicCityFile),getString(R.string.pnTopicCity),clientCity);
                    if (!lastCity.equals("first")){
                        FirebaseMessaging.getInstance().unsubscribeFromTopic(lastCity);
                    }
                }
            }
        }
    }

它在 Android 8.0 和 Android 7.1 设备上崩溃。它也适用于其他设备上的相同 Android 版本。

是否与 Firebase 令牌生成有关?

它在第二次打开应用程序时也崩溃了,到那时肯定应该生成 Firebase 令牌了。

在此感谢任何帮助。

subscribeToTopic() 方法的字符串参数名称中不能有'space'。

我使用 Android 地址 API 来获取位置名称,对于少数位置,名称类似于 "New York"。在调用方法之前删除空格有效。

longPCountry = longPCountry.replace(" ","");

允许的格式是[a-zA-Z0-9-_.~%]{1,900}