具有解析推送通知的Android Gradle产品风味

col*_*rew 6 android push-notification parse-platform android-gradle-plugin android-productflavors

我正在尝试通过Parse发送推送通知并集成产品风格.当我实现产品风味时,我无法接收Parse推送通知.有没有人有任何关于纠正这个问题的建议

Gradle app文件:

apply plugin: 'com.android.application'

android {
compileSdkVersion 19
buildToolsVersion "21.1.2"

defaultConfig {
    applicationId "com.example.project"
        minSdkVersion 16
        targetSdkVersion 21

}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}
productFlavors{
    freeApp{
        applicationId "com.example.project.free"

    }
    premiumApp{
        applicationId "com.example.project.paid"
    }
}
}

dependencies {
compile files('libs/android-async-http-1.4.2-66-g4b6eb97.jar')
compile files('libs/android-support-v13.jar')
compile files('libs/bolts-android-1.2.0.jar')
compile files('libs/Parse-1.9.2.jar')
compile files('libs/ParseCrashReporting-1.9.2.jar')
}
Run Code Online (Sandbox Code Playgroud)

Android Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.project"
android:versionCode="1"
android:versionName="1.1" >

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<permission android:name="com.example.project.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.project.permission.C2D_MESSAGE" />

<application
    android:name="com.example.project.Application"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">



    <activity
        android:name="com.example.project.MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>



    <meta-data android:name="com.parse.push.notification_icon" android:resource="@drawable/ic_launcher"/>

    <service android:name="com.parse.PushService" />
    <receiver android:name="com.parse.ParseBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.USER_PRESENT" />
        </intent-filter>
    </receiver>
    <receiver android:name="com.parse.ParsePushBroadcastReceiver"
        android:exported="false">
        <intent-filter>
            <action android:name="com.parse.push.intent.RECEIVE" />
            <action android:name="com.parse.push.intent.DELETE" />
            <action android:name="com.parse.push.intent.OPEN" />
        </intent-filter>
    </receiver>
    <receiver android:name="com.parse.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" />

            <!--
              IMPORTANT: Change "com.parse.starter" to match your app's package name.
            -->
            <category android:name="com.example.project" />
        </intent-filter>
    </receiver>
</application>
Run Code Online (Sandbox Code Playgroud)

Mor*_*ard 8

我刚刚使用Manifest Merger解决了完全相同的问题:

 ${applicationId}
Run Code Online (Sandbox Code Playgroud)

例:

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

    <application>
        <receiver
            android:name="com.parse.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="${applicationId}" />
            </intent-filter>
        </receiver>
    </application>
Run Code Online (Sandbox Code Playgroud)


dav*_*ola 2

注意:正如我们所观察到的,我的解决方案比下面 Morten Holmgaard 的解决方案要复杂一些。不用说,如果我知道有更简单的解决方案,我就会提出这个方案。然而,我的答案确实包含一些相关的解释,并且它也是五周内唯一且唯一正确的答案,所以我将保留它。

=================================================== =========================

有什么问题?

我认为您没有收到任何推送的原因是您在 AndroidManifest.xml 中为 Parse 声明了以下内容:

<permission android:name="com.example.project.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.project.permission.C2D_MESSAGE" />

<receiver android:name="com.parse.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" />

        <!--
          IMPORTANT: Change "com.parse.starter" to match your app's package name.
        -->
        <category android:name="com.example.project" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

然而,包名称定义为

applicationId "com.example.project.free"
Run Code Online (Sandbox Code Playgroud)

applicationId "com.example.project.paid"
Run Code Online (Sandbox Code Playgroud)

因此,包名称与 AndroidManifest.xml 中的声明不匹配,因此 Parse 无法接收推送。实际上,如果您查看 logcat 输出,您应该会看到来自 Parse 的一条消息,它准确地告诉您 AndroidManifest.xml 中缺少什么。

那么,如何解决这个问题呢?

这是一个有点棘手的情况,但可以做到:

1.) 从源集中的 AndroidManifest.xml 中删除我上面引用的两个部分main( src/main/AndroidManifest.xml)。

2a.) 在源集中创建 AndroidManifest.xml free( src/free/AndroidManifest.xml) 并输入以下内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <permission
        android:name="com.example.project.free.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="com.example.project.free.permission.C2D_MESSAGE" />

    <application>
        <receiver
            android:name="com.parse.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.example.project.free" />
            </intent-filter>
        </receiver>

    </application>

</manifest>
Run Code Online (Sandbox Code Playgroud)

2b.) 对paid源集执行相同的操作。请务必正确替换 AndroidManifest.xml 中的包名称。

为什么这有效?

因为gradle并没有把the替换src/main/AndroidManifest.xml为the src/free/AndroidManifest.xml,而是将它们合并为一个。因此,如果您将声明从main源集中保留下来,然后将它们放入其中freepaid您将获得每种风格的正确合并的 AndroidManifest.xml。