Ответ 1
Нашел проблему. Я использовал 8.4.0 версию (обновленную) игровых сервисов.
compile 'com.google.android.gms:play-services-gcm:8.4.0' //GCM
Я уменьшил версию до 8.3.0
. Он работает так, как ожидалось.
Вот моя интересная проблема. Уведомление Android, которое поступает от GCM, не показывает заголовок и контент ( просто показывает имя приложения, а при нажатии открывается MainActivity), когда приложение не запущено.
Но когда приложение открыто, оно показывает заголовок успешно. В чем проблема? Он работал без проблем, и я ничего не менял.
манифеста:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.package.xxx.permission.C2D_MESSAGE" />
<permission android:name="com.package.xxx.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<receiver
android:name="com.google.android.gms.gcm.GcmReceiver"
android:exported="true"
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.package.xxx" />
</intent-filter>
</receiver>
<service
android:name=".Service.GcmService"
android:exported="false" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
GcmService.java:
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.text.TextUtils;
import android.util.Log;
import com.google.android.gms.gcm.GcmListenerService;
import com.package.xxx.Activity.ReadNormal;
import com.package.xxx.R;
public class GcmService extends GcmListenerService {
public GcmService() {
}
@Override
public void onMessageReceived(String from, Bundle data) {
Log.d("GCMService", data.toString());
String type = data.getString("type", "");
if(type.equals("news")) {
showNewsNotification(data);
}
}
private void showNewsNotification(Bundle data) {
String neId = data.getString("neId");
if(TextUtils.isEmpty(neId)) {
return;
}
int id = Integer.valueOf(neId);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setContentTitle(data.getString("neTi"))
.setContentText("Click to read more.")
.setSmallIcon(R.drawable.ic_launcher)
.setAutoCancel(true);
Intent i = new Intent();
i.putExtra("neSi", data.getString("neSi"));
i.putExtra("neUr", data.getString("neUr"));
i.putExtra("neTi", data.getString("neTi"));
i.putExtra("neIm", data.getString("neIm"));
i.putExtra("neId", id);
i.setClass(this, ReadNormal.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
/***/
PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(pi);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, mBuilder.build());
}
@Override
public void onDeletedMessages() {
}
@Override
public void onMessageSent(String msgId) {
}
@Override
public void onSendError(String msgId, String error) {
}
Спасибо.
Журналы, когда приложение запущено.
D/GCMService: Bundle[{neId=4663755, neIm=http://icdn.posta.com.tr/editor/HD/30/1/2016/fft2mm7549077.jpg, neSi=Posta, neTi=Erdoğan: Rusya sonucuna katlanır, neUr=http://www.posta.com.tr/turkiye/HaberDetay/Erdogan--Rusya-sonucuna-katlanir.htm?ArticleID=324647, type=news, notification=Bundle[{e=1}], collapse_key=com.tekmobil.guncelhaber}]
Журналы, когда приложение не запущено.
(empty, there is no log)
Нашел проблему. Я использовал 8.4.0 версию (обновленную) игровых сервисов.
compile 'com.google.android.gms:play-services-gcm:8.4.0' //GCM
Я уменьшил версию до 8.3.0
. Он работает так, как ожидалось.
Вместо
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, mBuilder.build());
попробуйте использовать
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(0, mBuilder.build());
Вкратце: попробуйте установить content_available=false
при создании push на стороне сервера. Объяснение следует.
Это происходит из версии 8.4.0 игровых сервисов.
В документации говорится, что если вы отправляете нисходящее сообщение с полезной нагрузкой data
и notification
, поведение изменяется, если приложение находится на переднем плане или в фоновом режиме:
onMessageReceived
, и вы можете вручную обрабатывать свое уведомлениеtitle
и body
из полезной нагрузки уведомления. Если вы не указали их, title
заполняется именем приложения, а body
остается пустым (и это кажется вашим делом).В вашем случае я увидел в пакете сообщений эту странную вещь notification=Bundle[{e=1}]
Я столкнулся с той же проблемой. Эта полезная нагрузка уведомлений создается самостоятельно. Мне удалось удалить его, установив content_available=false
при построении push на стороне сервера. Это проблема, если вы также работаете с iOS, но я не нашел лучшего решения... попробуйте.
В этом документе google doc я привел: https://developers.google.com/cloud-messaging/concept-options#notifications_and_data_messages
Надеюсь, это поможет, пока
Я думаю, что ваша проблема в этой строке:
вы не включили это:
<service
android:name="com.example.MyInstanceIDListenerService"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.iid.InstanceID" />
</intent-filter>
</service>
Lollipop немного меняет это значение, создавая небольшое всплывающее окно вверху окна устройства, когда создается уведомление.
Здесь a Официальная документация: setFullScreenIntent
Используя этот метод, вы можете создать новое действие с любым настраиваемым макетом, который хотите и запустить, вместо того, чтобы помещать уведомление в строку состояния.
Проблема с версией GCM 8.4.0, она отправляет служебную информацию уведомления, даже если вы не отправляете ее на свой сервер.
notification=Bundle[{e=1}
Но если вы добавите это поле e
со значением zero
на свой сервер, он будет работать.
Подробнее см. здесь.