【问题标题】:FCM - onTokenRefresh is never called on multi-flavored android appFCM - onTokenRefresh 永远不会在多风格的 android 应用程序上调用
【发布时间】:2017-04-07 04:11:34
【问题描述】:

我有一个多风格的安卓应用。两种口味的包名称相同(com.mycompany.base)。在应用程序级别的 gradle 文件中,这两种风格都有自己的应用程序 ID(com.mycompany.firstflavor 和 com.mycompany.secondflavor)。

过去,对于像地图这样的 google play 服务,我使用了这两种应用程序 ID,并获取了包含两种风格信息的 google-services.json 文件。我只需要将这个 json 文件复制到我的应用程序中,一切正常。

最近我创建了一个 FCM 项目以实现推送通知,并像以前一样使用它们的应用程序 ID 将每种风格添加为应用程序。起初,我只在应用程序的建议位置包含了一份 json 文件。当我以一种风格运行应用程序时,它说 Firebase 已成功初始化。但是,从未调用过 onTokenRefresh 方法。我在互联网上搜索,有一些相关的主题,但没有一个解决方案适用于我的情况。当我以另一种方式运行应用程序时,应用程序不断崩溃并显示错误消息:java.lang.NoSuchMethodError: No static method 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: duplicate entry: com/google /android/gms/common/internal/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()
    }
}

非常感谢任何帮助!

【问题讨论】:

  • 更新您的构建依赖项以使用 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 文件或使用 applicationIDs 而不是包名的方式有问题?但我还在 Firebase 控制台中使用包名添加了应用程序。所以我的 firebase 项目实际上有三个应用程序。

标签: android firebase google-play-services firebase-cloud-messaging


【解决方案1】:

经过几天的努力,我终于找到了问题所在。在我的清单文件中,我错误地将服务操作的 android 名称设置为:come.google.firebase.INSTANCE_ID_EVENT 而不是 com.google.firebase.INSTANCE_ID_EVENT。

【讨论】:

  • 但我还有另一个问题。正如我在原始帖子中所说,我使用每种风味的 applicationID 在我的 firebase 项目中创建应用程序。但是,我的 android 项目的包名与这些应用程序 ID 不同。
  • 当我在 onMessageReceived() 中处理 firebase 消息时,我需要构建一堆活动,以便我的应用可以转到顶部活动。当用户单击返回时,它应该跟随堆栈从顶部获取下一个,依此类推。问题是在 onMessageRecived() 中,当我使用 stackBuilder.addParentStack(activity.class) 时,它会将 applicationID 附加到活动名称,这是不正确的。如果使用完全限定名称是不可避免的,我如何将 applicationID 替换为真实的包名称?谢谢
猜你喜欢
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 2014-08-14
  • 2016-08-20
  • 2020-08-25
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
相关资源
最近更新 更多