Подтвердить что ты не робот

Уведомление Android не показывает его содержимое, когда приложение не запущено

Вот моя интересная проблема. Уведомление 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)
4b9b3361

Ответ 1

Нашел проблему. Я использовал 8.4.0 версию (обновленную) игровых сервисов.

compile 'com.google.android.gms:play-services-gcm:8.4.0' //GCM

Я уменьшил версию до 8.3.0. Он работает так, как ожидалось.

Ответ 2

Вместо

    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(0, mBuilder.build());

попробуйте использовать

NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(0, mBuilder.build());

Ответ 3

Вкратце: попробуйте установить 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

Надеюсь, это поможет, пока

Ответ 4

Я думаю, что ваша проблема в этой строке:

вы не включили это:

<service
            android:name="com.example.MyInstanceIDListenerService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.android.gms.iid.InstanceID" />
            </intent-filter>
        </service>

Ответ 5

Lollipop немного меняет это значение, создавая небольшое всплывающее окно вверху окна устройства, когда создается уведомление.

Здесь a Официальная документация: setFullScreenIntent

Используя этот метод, вы можете создать новое действие с любым настраиваемым макетом, который хотите и запустить, вместо того, чтобы помещать уведомление в строку состояния.

Ответ 6

Проблема с версией GCM 8.4.0, она отправляет служебную информацию уведомления, даже если вы не отправляете ее на свой сервер.

notification=Bundle[{e=1}

Но если вы добавите это поле e со значением zero на свой сервер, он будет работать.

Подробнее см. здесь.