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}
我有一个方法 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}