带有 Parse Push Notifications 的 Android Gradle 产品风格

时间:2023-01-31
本文介绍了带有 Parse Push Notifications 的 Android Gradle 产品风格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

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

I am trying to send Push notifications via Parse and integrating product flavors. When I implement product flavors, i am not able to receive Parse Push Notifications. Does anyone have any advise on correcting this issue

Gradle 应用文件:

Gradle app file:

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')
}

Android 清单

<?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>

推荐答案

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

NOTE: As has been observed, my solution is somewhat more complicated than the one by Morten Holmgaard below. Needless to say, had I known of the simpler solution I would have proposed that one. However, my answer does contain some relevant explanation and it also was the only - and only correct - answer for five weeks, so I will leave it up.

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

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

有什么问题?

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

I think the reason you are not receiving any pushes is that in your AndroidManifest.xml you declare the following for 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>

然而,包名被定义为

applicationId "com.example.project.free"

applicationId "com.example.project.paid"

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

So the package names don't match the declarations in your AndroidManifest.xml and therefore Parse is unable to receive pushes. Actually, if you look at your logcat output, you should be seeing a message from Parse that tells you exactly what is missing in your AndroidManifest.xml.

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

这有点棘手,但可以做到:

This is a bit of a tricky situation but it can be done:

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

1.) Remove the two parts I quoted above from the AndroidManifest.xml in your main source set (src/main/AndroidManifest.xml).

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

2a.) Create an AndroidManifest.xml in your free source set (src/free/AndroidManifest.xml) and enter the following:

<?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>

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

2b.) Do the same for the paid source set. Be sure to replace the package name correctly in the AndroidManifest.xml.

为什么会这样?

因为 gradle 不会将 src/main/AndroidManifest.xml 替换为 src/free/AndroidManifest.xml 而是 merges 他们合而为一.因此,如果您只是将声明从 main 源集中取出并将它们放入 freepaid 中,您将获得正确合并的 AndroidManifest.每种口味的 xml.

Because gradle does not replace the src/main/AndroidManifest.xml with the src/free/AndroidManifest.xml but instead merges them into one. So if you just leave the declarations out of the main source set and put them in to free and paid you will get a correctly merged AndroidManifest.xml for each flavor.

这篇关于带有 Parse Push Notifications 的 Android Gradle 产品风格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

上一篇:使用 gradle 构建特定的 Android Product Flavor 时,我可以排除区域资源(例如 values 下一篇:如何从任何地方获取包名?

相关文章

最新文章