Android GCM with product flavors

I have GCM sample android gradle project. Its worked well, when I add 2 flavors a push notification stopped to work. My compilation manifest (it’s taken from app\build\intermediates\manifests\ex\debug) file is below:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.flavor.app"
    <uses-permission android:name="com.flavor.app.permission.C2D_MESSAGE" />

    <permission
        android:name="com.flavor.app.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

        <receiver
            android:name="com.google.android.gcm.GCMBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

                <category android:name="com.flavor.app" />
            </intent-filter>
        </receiver>

        <service android:name="com.ex.app.GCMIntentService" />
        <service
            android:name="com.ex.app.AppLocationService"
            class=".AppLocationService" >
            <intent-filter>
                <action
                    android:name=".AppLocationService"
                    android:value=".AppLocationService" />
            </intent-filter>
        </service>

What should I do to fix this problem? Please help.

  • connectedAndroidTest on multiple emulators
  • SurfaceHolder.setFormat(PixelFormat.RGBA_8888) fails on some devices and not others
  • Retain Fragment state between Activities
  • how to get color at the spot(or pixel) of a image on touch event in android
  • Difference between android dimension: pt and dp
  • how to access resources in a android library project
  • UPD1. I am using gradle v.0.12+. i think my final manifest file looks good, GCMRegistrar.checkManifest(this); – without errors, but GCMRegistrar.isRegistered(this) always false. =(

    UPD2. My first flavor project with original package name (as project in main branch) works well, but second flavor with changed package doesn’t work (registrationId for push is still empty), but in manifest file all permitions are correct.

  • Wifi-Direct always disconnects after thirty minutes
  • Intent Filter to Launch My Activity when custom URI is clicked
  • ClassNotFoundException when using custom Parcelable
  • NavigationView and custom Layout
  • Error after updating the Android.Support Library v7 AppCompat to the 21.0.3 version
  • Side effects of changing filter and requirements of an existing app in Android Play/Market
  • 3 Solutions collect form web for “Android GCM with product flavors”

    Simpy use the ${applicationId} alias like this

    <permission android:name=            "${applicationId}.permission.C2D_MESSAGE"
                android:protectionLevel= "signature" />
    <uses-permission android:name=       "${applicationId}.permission.C2D_MESSAGE" />
    <uses-permission android:name=       "com.google.android.c2dm.permission.RECEIVE" />
    

    And for the corresponding receiver use this

        <receiver
            android:name = "com.mixpanel.android.mpmetrics.GCMReceiver"
            android:permission = "com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name = "com.google.android.c2dm.intent.RECEIVE"/>
                <action android:name = "com.google.android.c2dm.intent.REGISTRATION"/>
    
                <category android:name = "${applicationId}"/>
            </intent-filter>
        </receiver>
    

    I found solution in this post GCM not registering when changing package name with Gradle. I just override BroadcastReceiver, if anyone can explain why it helpes please tell me.

    add following code in apps build.gradle which will copy selected flovour json file to app folder.

    gradle.taskGraph.beforeTask { Task task ->
            if(task.name ==~ /process.*GoogleServices/) {
                android.applicationVariants.all { variant ->
                    if(task.name ==~ /(?i)process${variant.name}GoogleServices/){ 
                        copy {
                            from "/src/${variant.flavorName}"
                            into '.'
                            include 'google-services.json'
                        }
                    }
                }
            }
        }
    
    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.