从状态栏中展开的通知中获取文本?

4
能否在状态栏中获取扩展通知中的文本?这意味着可以获取通过Notification.BitTextStyle.bigText()设置的文本,例如Gmail电子邮件通知中的文本。
我想使用Notification.extras获取它,但似乎没有常量,例如Notification.EXTRA_BIG_TEXT,可以使其起作用。
还有其他方法可以获取此文本吗? 此外,当我使用

String 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


@LarryMcKenzie 谢谢你的想法 :) - REG1
尝试使用EXTRA_TEXT获取bigText,我查看了源代码,似乎BigTextStyle覆盖了extras捆绑中的EXTRA_TEXT。 - Larry McKenzie
回复按钮并没有什么不同,它只是一个额外的操作,但有可能他们没有使用BigTextStyle通知。如果是这种情况,你将很难获取到那个文本。如果他们正在使用BigTextStyle,你可以通过EXTRA_TEXT获取到文本。 - Larry McKenzie
@LarryMcKenzie 好的,我想我会再检查一遍,看看是否有遗漏的地方。再次感谢您的大力帮助 :) - REG1
@LarryMcKenzie 很有趣,我之前忽略了一个错误信息,因为它是橙色的而不是红色的(在LogCat中)。我已经在“更新”下面添加了这个信息,请您检查一下。 - REG1
显示剩余6条评论
2个回答

11

好的,基于这个新信息,我会尝试像这样做:

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();
}

哇,太棒了,非常感谢你的帮助,我一定会回来并在我有足够的声望时为你的答案点赞。真的很好 :) - REG1

1
当任何通知生成“大型样式通知”时,可以使用android.bigText键获取扩展文本:
if(mExtras.getCharSequence("android.bigText")) {
    String body = mExtras.getCharSequence("android.bigText");
}

你有没有想过如何确定它是否生成大型通知,以便知道你必须使用android.bigText键而不是Notification.EXTRA_BIG_TEXT? - Boris Gafurov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接