Получить текст из расширенного уведомления в строке состояния?

Можно ли получить текст в расширенном уведомлении в statusbar? Это означает, что текст устанавливает мой Notification.BitTextStyle.bigText(), например, в уведомлении по электронной почте от Gmail.

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

Есть ли другой способ получить этот текст? Кроме того, когда я использую

Строка bigTitle = mExtras.getString(Notification.EXTRA_TITLE_BIG;

он возвращает null, есть идеи, почему? Я использую это, чтобы получить тему письма (Testing the new Gmail notification shortcuts -> см. ссылку ниже).

Ниже приведен пример расширенного уведомления Gmail: (Я хочу получить следующий текст ->

Теперь вы получаете кнопки быстрого доступа для ответа и архивации в...

Изображение уведомления Gmail (невозможно опубликовать картинки с репутацией менее 10, извините)

В качестве альтернативы я также пробовал следующее:

RemoteViews rv = mNotification.contentView;
LayoutInflater inflater =   (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewGroup localView = (ViewGroup) inflater.inflate(rv.getLayoutId(), null);
rv.reapply(getApplicationContext(), localView);
everything = new StringBuilder(150);

      for(int i=0; i<((ViewGroup)localView).getChildCount(); ++i) {
            View nextChild = ((ViewGroup)localView).getChildAt(i);
            try{
                TextView tv = (TextView) localView.findViewById(nextChild.getId());
                everything.append(tv.getText().toString());
            }catch(Exception e){
                continue;
            }
      }
Log.i("abc", everything.toString());

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

Обновление:

Когда я использую следующий код для получения текста из уведомления...:

body = mExtras.getString(Notification.EXTRA_TEXT);

... все работает хорошо, если это не уведомление Gmail/Email:

Как только я получаю уведомление Gmail, я получаю следующее сообщение об ошибке:

08-19 20:19:37.379: W/Bundle(6646): Key android.text expected String but value was a android.text.SpannableString.  The default value <null> was returned.
08-19 20:19:37.379: W/Bundle(6646): Attempt to cast generated internal exception:
08-19 20:19:37.379: W/Bundle(6646): java.lang.ClassCastException: android.text.SpannableString cannot be cast to java.lang.String
08-19 20:19:37.379: W/Bundle(6646):     at android.os.Bundle.getString(Bundle.java:1121)
08-19 20:19:37.379: W/Bundle(6646):     at com.myprojectabc.storage.Core$mainmethod$1.run(Core.java:394)
08-19 20:19:37.379: W/Bundle(6646):     at android.os.Handler.handleCallback(Handler.java:733)
08-19 20:19:37.379: W/Bundle(6646):     at android.os.Handler.dispatchMessage(Handler.java:95)
08-19 20:19:37.379: W/Bundle(6646):     at android.os.Looper.loop(Looper.java:136)
08-19 20:19:37.379: W/Bundle(6646):     at android.app.ActivityThread.main(ActivityThread.java:5001)
08-19 20:19:37.379: W/Bundle(6646):     at java.lang.reflect.Method.invokeNative(Native Method)
08-19 20:19:37.379: W/Bundle(6646):     at java.lang.reflect.Method.invoke(Method.java:515)
08-19 20:19:37.379: W/Bundle(6646):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
08-19 20:19:37.379: W/Bundle(6646):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
08-19 20:19:37.379: W/Bundle(6646):     at dalvik.system.NativeStart.main(Native Method)

Если я затем попытаюсь решить эту проблему, изменив ее на это...

body = mExtras.getString(Notification.EXTRA_TEXT).toString();

...я получаю NullPointerException

Был бы очень признателен, если бы кто-нибудь помог мне здесь

Спасибо, REG1


person REG1    schedule 13.08.2014    source источник
comment
В документации нет ключа для данных, которые вы ищете. Так что либо его нет, либо он не задокументирован. Вы можете перебирать ключи и выводить значения в журнал, чтобы увидеть, выделяется ли ключ.   -  person Larry McKenzie    schedule 13.08.2014
comment
С какой целью вы хотите это сделать?   -  person Ajay S    schedule 13.08.2014
comment
@LarryMcKenzie Я забыл упомянуть, что я прошел через несколько ключей, которые, как мне казалось, могут иметь смысл для представления «тела электронного письма», но все они вернули значение null. Кажется, его не существует... обратите внимание на ключ EXTRA_PICTURE: это растровое изображение, которое будет отображаться в расширенных уведомлениях Notification.BigPictureStyle, предоставленных для bigPicture(android.graphics.Bitmap) -> Я хочу текст (не изображение), предоставленный bigText (), однако его не существует. Есть ли какой-нибудь быстрый обходной путь, кроме отражений Java? Спасибо за быстрый ответ :)   -  person REG1    schedule 13.08.2014
comment
Вместо того, чтобы угадывать возможные ключи, выполните итерацию по пакету дополнительных услуг и посмотрите, существует ли он. Если он не существует, маловероятно, что вы сможете получить эти данные.   -  person Larry McKenzie    schedule 13.08.2014
comment
@LarryMcKenzie спасибо за идею :)   -  person REG1    schedule 13.08.2014
comment
@LarryMcKenzie, это тоже не сработало, я добавил дополнительную информацию, если вы еще можете помочь   -  person REG1    schedule 19.08.2014
comment
Попробуйте использовать EXTRA_TEXT, чтобы получить bigText, я просмотрел источник, и оказалось, что BigTextStyle переопределяет EXTRA_TEXT в пакете дополнительных функций.   -  person Larry McKenzie    schedule 19.08.2014
comment
@LarryMcKenzie Я уже использую EXTRA_TEXT, однако это дает мне текст только в том случае, если это, например, уведомление о текстовом сообщении, а также многие другие уведомления, которые имеют только простой макет. Уведомление Gmail, кажется, работает по-другому (например, оно содержит кнопку ответа и т. д.). Я также думаю, что EXTRA_TEXT должен покрывать это, но по моему опыту это не так. Спасибо за быстрый ответ, очень приятно :)   -  person REG1    schedule 19.08.2014
comment
Кнопка ответа на самом деле не отличается, это просто добавленное действие, но возможно, что они не используют уведомление BigTextStyle. В этом случае вам будет очень трудно получить этот текст. Если бы они использовали BigTextStyle, вы бы получили текст с EXTRA_TEXT.   -  person Larry McKenzie    schedule 19.08.2014
comment
@LarryMcKenzie Хорошо, думаю, я еще раз все просмотрю, посмотрю, не забыл ли я что-нибудь, еще раз спасибо за вашу большую помощь :)   -  person REG1    schedule 19.08.2014
comment
@LarryMcKenzie Достаточно забавно, что я пропустил полученное сообщение об ошибке, потому что оно было оранжевым, а не красным (в LogCat). Я добавил эту информацию выше в разделе «Обновление», если вы не против проверить ее.   -  person REG1    schedule 19.08.2014


Ответы (2)


Итак, с этой новой информацией я бы попробовал что-то вроде этого:

SpannableString bigText = (SpannableString) mExtras.get(Notification.EXTRA_TEXT);
if(bigText != null){
    body = bigText.toString();
}

Изменить: после просмотра источника я бы попробовал это:

CharSequence bigText = (CharSequence) mExtras.getCharSequence(Notification.EXTRA_TEXT);
if(bigText != null){
    body = bigText.toString();
}
person Larry McKenzie    schedule 19.08.2014
comment
Вау, это было здорово, большое спасибо за вашу помощь, я обязательно вернусь и проголосую за ваш ответ, как только у меня будет достаточно репутации. Действительно мило :) - person REG1; 19.08.2014

Когда какое-либо уведомление генерирует Big Style Notification, расширенный текст можно получить с помощью клавиши android.bigText :

if(mExtras.getCharSequence("android.bigText")) {
    String body = mExtras.getCharSequence("android.bigText");
}
person Kushal    schedule 05.01.2016
comment
есть мысли о том, как выяснить, генерирует ли он уведомления Big Style, чтобы вы знали, что вам нужно использовать ключ android.bigText вместо Notification.EXTRA_BIG_TEXT? - person Boris Gafurov; 13.10.2017