我正在尝试通过 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
源集中取出并将它们放入 free
和 paid
中,您将获得正确合并的 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 产品风格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!