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)
我刚刚使用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)
注意:正如我们所观察到的,我的解决方案比下面 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源集中保留下来,然后将它们放入其中free,paid您将获得每种风格的正确合并的 AndroidManifest.xml。
| 归档时间: |
|
| 查看次数: |
1151 次 |
| 最近记录: |