我已经实现了 Parse 推送通知,但 Android 端对我来说存在问题。每当我从 Parse 发送通知时,所有 Android 设备都会收到两条通知,一条是我发送的文本,另一条是空文本。
请指出这里可能有什么问题
注意:我还在我的项目中添加了 native Android 通知(GCM 通知)。是否有可能是他们导致了这个问题?
谢谢。
AndroidManifest 设置如下:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<application
android:name=".activityApplication"
android:label="@string/app_name"
android:icon="@drawable/icon">
<activity android:name=".activity"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:configChanges="orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.google.android.gms.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
<!-- gcm -->
<receiver
android:name="com.company.activity.GCBroadcastReceiver"
android:exported="true"
android:process=":remote"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.company.activity" />
</intent-filter>
</receiver>
<service android:name=".GcmIntentService" />
<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.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.company.activity" />
</intent-filter>
</receiver>
</application>
这是我的广播接收器:
public class GCBroadcastReceiver extends BroadcastReceiver
{
private static final String TAG = "GCBroadcastReceiver";
Context ctx;
@Override
public void onReceive(Context context, Intent intent)
{
ctx = context;
// Local notification.
Bundle bundle = intent.getExtras();
String message = bundle.getString("message");
String notificationID = bundle.getString("notificationID");
Log.v(TAG,"Notification message : " + message + "With ID : " + notificationID);
sendNotification(message, notificationID);
}
// Put the GCM message into a notification and post it.
private void sendNotification(final String message, final String notificationID)
{
Intent notificationIntent = new Intent(ctx, Activity.class);
PendingIntent intent = PendingIntent.getActivity(ctx, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ctx);
mBuilder.setContentIntent(intent);
mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(message));
mBuilder.setWhen(System.currentTimeMillis());
mBuilder.setSmallIcon(R.drawable.icon);
mBuilder.setContentTitle(ctx.getString(R.string.app_name));
mBuilder.setContentText(message);
mBuilder.setLights(Color.RED, 400, 400);
mBuilder.setAutoCancel(true);
//mBuilder.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + ctx.getPackageName() + "/raw/" + sound));
mBuilder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);
NotificationManager mNotificationManager = (NotificationManager) ctx
.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, mBuilder.build());
}
}
最佳答案
Parse 使用 GCM,因此如果您向使用 Parse 的应用程序发送通知,并且您还使用显示通知的 native Android 代码处理 GCM 消息,则该通知可能会被处理两次(一次由您的代码处理一次通过 Parse),这将导致它显示两次。
至于为什么其中一个通知有空文本 - 显示它的代码可能希望文本位于服务器未发送的额外参数中,因此没有文本可显示。
更新:
既然我看到了你的代码,我可以添加以下内容:
您有两个处理传入 GCM 消息的广播接收器 - com.parse.GcmBroadcastReceiver
和 com.company.activity.GCBroadcastReceiver
。他们都尝试处理从 Parse 发送到您设备的通知(根据您在下面的评论,我了解到当您发送“本地”通知时不会出现该问题)。
我假设 Parse 库自行注册到 GCM。如果您使用不同的发送者 ID(API 项目 ID)进行解析注册和本地 GCM 注册,您可以通过检查 intent.getExtras ().get("from")
来解决您的问题在您的 onReceive
方法中。如果它不包含您本地通知的发送者 ID,请不要调用 sendNotification(message, notificationID);
,第二个带有空文本的通知将不会显示。
public void onReceive(Context context, Intent intent)
{
ctx = context;
// Local notification.
Bundle bundle = intent.getExtras();
String message = bundle.getString("message");
String notificationID = bundle.getString("notificationID");
Log.v(TAG,"Notification message : " + message + "With ID : " + notificationID);
if (intent.getExtras ().get("from").equals (YOUR_SENDER_ID_FOR_LOCAL_NOTIFICATIONS))
sendNotification(message, notificationID);
}
现在,如果您对两种类型的通知使用相同的发件人 ID,您可以开始使用不同的发件人 ID,或者您可以使用不同的条件 - 检查 intent.getExtras ().get("message")
有一个值。您的本地通知需要此参数,我假设 Parse 通知不需要(这解释了您看到的没有文本的通知)。
使用两个 GCM 广播接收器也可能会导致其他问题,所以我建议你看看 this question进一步阅读。
关于android - 发送到 Android 设备的额外推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22491156/