2016-01-28 23 views
20

Đây là vấn đề thú vị của tôi. Thông báo Android đến từ GCM không hiển thị tiêu đề và nội dung (chỉ hiển thị Tên ứng dụng và khi nhấp, mở MainActivity) khi ứng dụng không chạy.Thông báo trên Android không hiển thị nội dung của ứng dụng khi ứng dụng không chạy

Nhưng khi ứng dụng đang mở, nó hiển thị thành công tiêu đề và nội dung. Những gì có thể là vấn đề? Nó đang chạy mà không có vấn đề và tôi đã không thay đổi bất cứ điều gì.

Manifest:

<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) { 
    } 

Cảm ơn bạn.

Nhật ký khi ứng dụng đang chạy.

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}] 

Nhật ký khi ứng dụng KHÔNG chạy.

(empty, there is no log) 
+0

Có nhật ký lỗi nào không? bạn có thể cung cấp cho chúng tôi nhật ký của bạn không? –

+0

Không có nhật ký nào đáng tiếc. Rất thú vị. – Ozgur

+0

Đăng nhật ký được trả về thông qua dòng sau: 'Log.d (" GCMService ", data.toString());' trong cả hai trường hợp. –

Trả lời

7

Tìm thấy vấn đề. Tôi đã sử dụng phiên bản 8.4.0 (cập nhật) các dịch vụ phát.

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

Tôi đã giảm phiên bản thành 8.3.0. Nó hoạt động như mong đợi.

+3

điều này chắc chắn không phải là một giải pháp. Downgrading một phiên bản ... Tôi có vấn đề tương tự như tôi có thể xem nội dung nhưng không có tiêu đề .... hãy cố gắng tìm một giải pháp thích hợp như đối lập với workaround này.thanks – saur

+1

Tôi vẫn đang tìm kiếm một giải pháp nhưng điều này rõ ràng là vấn đề của phiên bản 8.4. – Ozgur

+1

ok, nó có thể được sửa trong phiên bản sau .... + 1 cho đến lúc đó – saur

3

Thay vì

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

thử sử dụng

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

Vẫn còn vấn đề tương tự. – Ozgur

1

Tôi nghĩ vấn đề của bạn là ở dòng này:

bạn chưa bao gồm này:

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

Lollipop thay đổi này một chút bằng cách tạo ra một cửa sổ pop nhỏ tại phía trên cùng của cửa sổ thiết bị khi một Thông báo được tạo.

Dưới đây là một tài liệu chính thức: setFullScreenIntent

Sử dụng phương pháp này, bạn có thể tạo mới Hoạt động với bất kỳ bố trí tùy chỉnh mà bạn muốn và khởi động mà thay vì đặt Notification trong thanh trạng thái.

3

Tóm tắt: thử đặt content_available=false khi xây dựng đẩy ở phía máy chủ. Lời giải thích sau.

Điều này xảy ra từ phiên bản 8.4.0 của dịch vụ phát. Các tài liệu nói rằng nếu bạn gửi một thông điệp hạ lưu với cả datanotification tải trọng, những thay đổi hành vi nếu App là trong foreground hoặc background:

  • trong foreground người nghe onMessageReceived được gọi và bạn có thể tự xử lý của bạn thông báo
  • trong nền thông báo được hệ thống tự động tạo bằng cách lấy titlebody từ tải trọng thông báo. Nếu bạn không chỉ định chúng, thì title sẽ được điền đầy đủ tên ứng dụng và body bị để trống (và có vẻ như trường hợp của bạn).

Trong trường hợp của bạn tôi thấy, trong gói tin nhắn, điều kỳ lạ này notification=Bundle[{e=1}] tôi gặp phải cùng một vấn đề. Trọng tải thông báo này được tự tạo. Tôi đã quản lý để xóa nó bằng cách thiết lập content_available=false khi xây dựng đẩy trên phía máy chủ. Đây là một vấn đề nếu bạn cũng đang làm việc với iOS, nhưng tôi không tìm thấy giải pháp nào tốt hơn ... hãy thử nó.

Đây google doc tôi trích dẫn: https://developers.google.com/cloud-messaging/concept-options#notifications_and_data_messages

Hy vọng nó giúp, tạm biệt

1

Vấn đề là với phiên bản GCM 8.4.0, nó được gửi một tải trọng thông báo ngay cả khi bạn không gửi nó trong máy chủ của bạn.

notification=Bundle[{e=1} 

Nhưng nếu bạn thêm lĩnh vực e này với giá trị zero trong máy chủ của bạn nó sẽ làm việc.

Để biết thêm chi tiết, hãy trả lời câu trả lời của tôi here.

Các vấn đề liên quan