我有一个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令牌。
在这里提供任何帮助。
答案 0 :(得分:0)
没有空间&#39;在subscribeToTopic()方法的字符串参数的名称中。
我使用的是Android地址API来获取位置名称,而对于少数几个地点,名称就像&#34;纽约&#34;。在调用方法之前删除空格。
longPCountry = longPCountry.replace(" ","");
允许的格式为[a-zA-Z0-9 -_。〜%] {1,900}