FirebaseMessaging.getInstance()上的java.lang.IllegalArgumentException.subscribeToTopic()

时间:2018-04-02 11:17:18

标签: android firebase push-notification android-notifications firebase-notifications

我有一个subscribeToTopic方法,可以将用户订阅到我的应用中针对Firebase通知的位置。

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

应用程序有时会在下面的行打开时崩溃。

FirebaseMessaging.getInstance().subscribeToTopic(longPCountry);

我从PlayStore的crashlog收到的错误是:

java.lang.IllegalArgumentException: 
  at com.google.firebase.messaging.FirebaseMessaging.subscribeToTopic (Unknown Source:89)
  at packagename.MapsActivity.subscribeToTopic (MapsActivity.java:1734)
  at packagename.MapsActivity$10.onSuccess (MapsActivity.java:1835)
  at packagename.MapsActivity$10.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令牌。

在这里提供任何帮助。

1 个答案:

答案 0 :(得分:0)

没有空间&#39;在subscribeToTopic()方法的字符串参数的名称中。

我使用的是Android地址API来获取位置名称,而对于少数几个地点,名称就像&#34;纽约&#34;。在调用方法之前删除空格。

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

允许的格式为[a-zA-Z0-9 -_。〜%] {1,900}