【问题标题】:Android notification is not showing it's content when app is not running当应用程序未运行时,Android 通知未显示其内容
【发布时间】:2016-01-28 11:00:48
【问题描述】:

这是我有趣的问题。当应用未运行时,来自 GCM 的 Android 通知不显示标题和内容(显示应用名称,单击时打开 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)

【问题讨论】:

  • 有错误日志吗?你能提供给我们你的日志吗?
  • 很遗憾没有日志。很有趣。
  • 发布通过以下行返回的日志:Log.d("GCMService", data.toString()); 在这两种情况下。
  • @OzgurGUL 这很奇怪。因为如果data 为空。那么您的应用根本不应该显示任何通知。
  • @EricB。是的,有趣的问题。

标签: java android google-cloud-messaging android-notifications


【解决方案1】:

发现问题。我使用的是 8.4.0 版本(最新)的播放服务。

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

我将版本减少到8.3.0。它按预期工作。

【讨论】:

  • 这绝对不是解决方案。降级版本...我有类似的问题,我可以看到内容但没有标题....请尝试找到与此解决方法相反的适当解决方案。谢谢
  • 我仍在寻找解决方案,但这显然是 8.4 版的问题。
【解决方案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。解释如下。

    这发生在 8.4.0 版的播放服务中。 文档说,如果您发送带有datanotification 有效负载的下游消息,则如果应用程序处于前台或后台,则行为会发生变化:

    • 在前台调用侦听器onMessageReceived,您可以手动处理通知
    • 在后台,系统通过从通知负载中获取titlebody 自动构建通知。如果您不指定它们,title 将填充应用程序名称,body 将留空(这似乎是您的情况)。

    在你的情况下,我在消息包中看到了这个奇怪的东西notification=Bundle[{e=1}] 我遇到了同样的问题。此通知有效负载是自行生成的。在服务器端构建推送时,我设法通过设置content_available=false 将其删除。如果您也在使用 iOS,这是一个问题,但我没有找到更好的解决方案...试试看。

    这里是我引用的谷歌文档: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 通过在创建通知 时在设备窗口顶部创建一个小弹出窗口来稍微改变这一点。

        这是官方文档:setFullScreenIntent

        使用此方法,您可以创建一个具有您想要的任何自定义布局的新 Activity 并启动它,而不是将 Notification 放在状态栏中。

        【讨论】:

          【解决方案6】:

          问题在于 GCM 8.4.0 版本,即使您没有在服务器中发送它,它也会发送通知负载。

          notification=Bundle[{e=1}
          

          但如果你在你的服务器中添加这个值为zeroe 字段,它将起作用。

          更多详情请看我的回答here

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多