2015-03-31 24 views
7

Câu hỏi đặt ra là làm thế nào để có được trường TEXT (không phải tiêu đề) của tất cả các thông báo đến khi chúng được xếp chồng lên nhau (như trong Whatsapp).Cách nhận văn bản của Thông báo xếp chồng lên nhau trong Android

enter image description here

public class NLService extends NotificationListenerService { 
public void onNotificationPosted(StatusBarNotification sbn) { 

    Log.v(Constants.TAG_notifs, 
      "------------------------- in onNotificationPosted(), Notification Text = " 
        + sbn.getNotification().tickerText); 


    Bundle extras = sbn.getNotification().extras; 

    if (extras.containsKey("android.text")) { 
     if (extras.getCharSequence("android.text") != null) { 
      String text = extras.getCharSequence("android.text").toString(); 
      Log.v(Constants.TAG_notifs, 
        "------------------------- in onNotificationPosted(), Bundle.text != NULL, so here it is = " 
          + text); 
     } 
    } 

    if (extras.containsKey("android.title")) { 
     Log.v(Constants.TAG_notifs, 
       "------------------------- in onNotificationPosted(), Bundle android.title = " 
         + extras.getString("android.title")); 
    } 

} 

@Override 
public void onNotificationRemoved(StatusBarNotification sbn) { 
    //super.onNotificationRemoved(sbn); 
} 

} Lần đầu tiên khi một thông báo Whatsapp đến từ một người dùng duy nhất dòng này (String text = extras.getCharSequence ("android.text") toString();.) thành công có thể đọc văn bản, nhưng sau đó khi có nhiều thư đến và thông báo được xếp chồng lên nhau (như trong hình minh họa ở trên), biến văn bản luôn là NULL.

Điều này phải có thể vì this app đang thực hiện, đã thử nghiệm. Đó là nhận được văn bản của mỗi và mọi ứng dụng.

Đã thêm khuyến khích: Nếu bạn biết câu trả lời hoặc những điều cần thử, có một câu hỏi khác có vẻ giống câu hỏi here.

Trả lời

14

ứng dụng WhatsApp có cấu trúc cho việc gửi thông báo như thế này:

 Case         Notification 

Message comes from A : Hi     Title : A Text: Hi 

Message comes from A : How are you   Title : A Text: How are you 

              Title : A Text: 2 new messages 


Message comes from B : Hello    Title : B Text: Hello 

              Title : B Text: 1 new message 

              Title : A Text: 2 new messages 

        Title : WhatsApp Text: 3 new messages from 2 conversation 
---- Here comes the stacking ---- 

Message comes from C : Good work   Title : C Text: Good work 

              Title : C Text: 1 new message 

              Title : B Text: 1 new message 

              Title : A Text: 2 new messages 

        Title : WhatsApp Text: 4 new messages from 3 conversation 


---- This way when new sender message comes, previoud notifications also comes and we get callback in NotificationListener ---- 

thông báo cuối đi kèm với Tiêu đề như Tên gói: WhatsApp và văn bản như: thông điệp X từ Y thoại

Để có được văn bản:

sbn.getNotification().extras.getCharSequence(Notification.EXTRA_TEXT).toString(); 

Để nhận tiêu đề:

sbn.getNotification().extras.getCharSequence(Notification.EXTRA_TITLE).toString(); 

Để làm việc với sturcture này xếp chồng, chúng ta cần phải phân tích cú pháp thông báo chồng này và chỉ hiển thị thông tin có chọn lọc trong ứng dụng của chúng tôi

Tôi hy vọng câu trả lời của tôi sẽ giúp đỡ và giải quyết truy vấn của bạn

+0

Khi thông báo thứ 2 (giả sử từ A trong ví dụ của bạn) có trong 'sbn.getNotification().getCharSequence (Notification.EXTRA_TEXT) .toString(); ' là NULL, không có gì ở đó cả. Bạn không nhìn thấy nó NULL quá? Tôi đang cố gắng trong Kitkat, API = 19 – user1406716

+0

Tôi không chắc chắn nếu điều này là đúng sự thật, bạn có thể xây dựng trên làm thế nào để có được thông báo trước đó ?: "* Bằng cách này khi tin nhắn người gửi mới đến, previoud thông báo cũng đến và chúng tôi nhận được gọi lại trong NotificationListener * " – user1406716

+0

Đối với KitKat, nó sẽ hoạt động tốt với AccessibilityService .. Hãy thử sử dụng dịch vụ gọi lại này .. Trong trường hợp của tôi, AccessibilityService đã hoạt động tốt cho đến (<= KitKat) để kiểm tra việc sử dụng nó – Kushal

0

Chỉ nghiên cứu trên WhatsApp với Quyền truy cập dịch vụ trợ năng. tất cả các thông báo đến khi chúng được xếp chồng lên nhau (như trong Whatsapp), bạn có thể sử dụng phương thức getEecord() của AccessibilityEvent để trích xuất ngữ cảnh trong ngăn xếp. Content chứa [người gửi, đến, thời gian, bối cảnh, index] thử nghiệm trên Android 5.1 trên MOTO G

1

Tôi nghĩ rằng đây có thể giúp bạn:

CharSequence[] lines = 
extras.getCharSequenceArray(Notification.EXTRA_TEXT_LINES); 
if(lines != null && lines.length > 0) { 
    StringBuilder sb = new StringBuilder(); 
    for (CharSequence msg : lines) 
     if (!TextUtils.isEmpty(msg)) { 
     sb.append(msg.toString()); 
     sb.append('\n'); 
     } 
    return sb.toString().trim(); 
} 
CharSequence chars = 
extras.getCharSequence(Notification.EXTRA_BIG_TEXT); 
if(!TextUtils.isEmpty(chars)) 
    return chars.toString(); 
0

Nếu bạn đang làm việc với Android 7.0 trở lên, WhatsApp sử dụng Thông báo mở rộng MessageStyle. Ở đây - https://developer.android.com/training/notify-user/expanded.html#message-style

Để lấy tất cả 5 tin nhắn từ một thông báo như

MyFriend (5 messages) 
testt 

Làm điều này:

Bundle extras = mysbn.getNotification().extras; 
if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)){ 
     Parcelable b[] = (Parcelable[]) extras.get(Notification.EXTRA_MESSAGES); 

     if(b != null){ 
      content = ""; 
      for (Parcelable tmp : b){ 

       Bundle msgBundle = (Bundle) tmp; 
       content = content + msgBundle.getString("text") + "\n"; 

       /*Set<String> io = msgBundle.keySet(); // To get the keys available for this bundle*/ 

      } 
     } 
    } 

Tương tự như câu trả lời của tôi here.

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