FCM - onTokenRefresh从未被称为多风味的Android应用程序
我有一个多风味的Android应用程序。两种口味(com.mycompany.base)的包名称相同。在应用程序级gradle文件中,这两种风格都有自己的应用程序ID(com.mycompany.firstflavor和com.mycompany.secondflavor)。FCM - onTokenRefresh从未被称为多风味的Android应用程序
过去,对于地图等谷歌播放服务,我使用了两个应用程序ID并获取包含两种风格信息的google-services.json文件。我只需要将这个json文件复制到我的应用程序中,一切正常。
最近我创建了一个FCM项目来实现推送通知,并像以前一样使用它们的应用程序ID将每个flavor添加为应用程序。起初,我只在应用程序中的建议位置包含了一个json文件的副本。当我以一种风格运行该应用程序时,它表示Firebase已成功初始化。但是,onTokenRefresh方法从未被调用过。我在互联网上搜索,并有一些相关的主题,但没有解决方案在我的案件。当我在另一种风格上运行应用程序时,应用程序不断崩溃并显示错误消息:java.lang.NoSuchMethodError:无静态方法zzb(Ljava/lang/Object; Ljava/lang/Object;)Ljava/lang/Object;在类Lcom/google/android/gms/common/internal/zzab中;或其超类(“com.google.android.gms.common.internal.zzab”的声明出现在/data/app/com.suran.dwmobile-2/base.apk:classes2.dex中)。这个问题发生在真实设备和模拟器上。然后我将json文件复制到两个位置,正如我在线阅读的一些建议。相同的json文件现在出现在两个地方,每个flavo下,例如app/src/firstflavor和app/src/secondflavor。但是这根本没有帮助,我仍然有同样的问题。这只是调试模式。
当我运行与生成变体设置为释放的应用程序,与两种口味,我得到了错误消息:com.android.build.api.transform.TransformException:java.util.zip.ZipException:重复条目:com /谷歌/安卓/ GMS /普通/内部/ zzv $ ZZA $ zza.class。我发现了类似问题的一些答案,但他们都不能解决我的问题。
这里是我的清单文件的一部分,这可能对调试有用:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:amazon="http://schemas.amazon.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.mycompany.base"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="21"
/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="archos.permission.FULLSCREEN.FULL" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
<uses-permission android:name="android.permission.SEND_SMS" android:required="false" />
<uses-permission android:name="android.permission.CAMERA" android:required="false"/>
<uses-feature android:name="android.permission.ACCESS_NETWORK_STATE" android:required="false"/>
<uses-feature android:name="android.permission.ACCESS_COARSE_LOCATION" android:required="false" />
<uses-feature android:name="android.permission.ACCESS_FINE_LOCATION" android:required="false" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.front" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.telephony" android:required="false" />
<uses-feature android:glEsVersion="0x00020000" android:required="false"/>
<application
android:name=".application.BaseApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/CompanyTheme"
>
<service android:name=".FBInstanceService">
<intent-filter>
<action android:name="come.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service android:name=".FBMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
</manifest>
这里是我的应用程序级别gradle这个文件:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion '25.0.0'
useLibrary 'org.apache.http.legacy'
defaultConfig {
minSdkVersion 10
targetSdkVersion 23
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
firstflavorRelease {
storeFile file("XXXXXX.jks");
storePassword("XXXXXXX");
keyAlias "XXXXXXX";
keyPassword "XXXXXXX";
}
secondflavorRelease {
storeFile file("XXXXXXX.jks");
storePassword("XXXXXXXX");
keyAlias "XXXXXXXXX";
keyPassword "XXXXXXXX";
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
productFlavors {
firstflavor {
applicationId = "com.mycompany.firstflavor"
signingConfig signingConfigs.firstflavorRelease
versionCode 1000
versionName "1.9.2"
}
secondflavor {
applicationId = "com.mycompany.secondflavor"
signingConfig signingConfigs.secondflavorRelease
versionCode 1000
versionName "1.2.2"
}
}
testOptions {
unitTests.returnDefaultValues = true
}
}
dependencies {
compile project(':myappCore')
compile files('libs/amazonmaps-1.0.2.jar')
compile files('libs/zbar.jar')
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.9.5'
androidTestCompile 'com.linkedin.dexmaker:dexmaker-mockito:2.2.0'
androidTestCompile 'com.android.support:support-annotations:23.4.0'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile "com.android.support.test.espresso:espresso-intents:2.2.1"
testCompile 'org.powermock:powermock-api-mockito:1.6.1'
testCompile 'org.powermock:powermock-module-junit4-rule-agent:1.6.1'
testCompile 'org.powermock:powermock-module-junit4-rule:1.6.1'
testCompile 'org.powermock:powermock-module-junit4:1.6.1'
testCompile "org.robolectric:robolectric:3.2.2"
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.google.android.gms:play-services-maps:9.0.0'
compile 'com.google.android.gms:play-services-gcm:9.0.0'
compile 'com.google.android.gms:play-services-auth:9.0.0'
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:mediarouter-v7:23.4.0'
compile 'com.google.firebase:firebase-core:9.2.1'
compile 'com.google.firebase:firebase-messaging:9.2.1'
compile 'org.jsoup:jsoup:1.10.2'
}
apply plugin: 'com.google.gms.google-services'
这里是我的项目级别gradle这个文件:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
classpath 'com.google.gms:google-services:3.0.0'
}
}
allprojects {
repositories {
jcenter()
}
}
任何帮助,非常感谢!
经过几天的争论,我终于找到问题所在。在我的清单文件中,我错误地将服务操作的android名称设置为:come.google.firebase.INSTANCE_ID_EVENT,而不是com.google.firebase.INSTANCE_ID_EVENT。
但我确实有另外一个问题。正如我在原始文章中所说的,我使用每个flavor的applicationID在我的firebase项目中创建应用程序。但是,我的android项目的包名称与这些应用程序ID不同。 –
当我在onMessageReceived()中处理firebase消息时,我需要构建一堆活动,其中我的应用可以转到顶层。当用户点击后,它应该跟随堆栈从顶部开始下一个,依此类推。问题是,在onMessageRecived()中,当我使用stackBuilder.addParentStack(activity.class)时,它会将applicationID附加到活动名称,这是不正确的。如果使用完全限定名称是不可避免的,我怎样才能用真正的包名替换applicationID?谢谢 –
更新您的构建依赖关系,使用“play-services- *”库的9.2.1版本使其与“firebase- *”库一致。 –
@BobSnyder我按照你的建议,将play-services-maps,play-services-gcm和play-services-auth的版本更改为9.2.1,以匹配fire-basemessaging的版本。因为我使用了弃用的MapView.getMap,所以我必须将其更改为使用MapFragmentFragment。变化之后,我以前的错误消失了,这是个好消息。非常感谢你。但onTokenRefresh仍然没有被调用。如果我在其中一个活动中的其他位置调用FirebaseInstanceId.getInstanc()。getToken(),我可以像之前那样获取该标记。但我认为这不能解决问题。 –
我仍然需要Firebase消息传递服务。由于未调用Firebase实例服务的方法,因此我不认为消息传递服务中的方法将被调用,其中包括我对消息的大量处理,并且对于推送通知实现很重要。我仍然认为我放置google-services.json文件的方式有问题,或者使用applicationID而不是包名?但我也在我的Firebase控制台中使用软件包名称添加了应用程序。因此,我的Firebase项目实际上有三个应用程序。 –