检测toast消息

13

我认为这是不可能的,因为在SDK文档中我还没有找到任何相关内容。

但是我想知道是否可能编写一个应用程序来记录Toast信息。记录显示Toast的应用程序以及该消息包含的内容。

这完全是为了创建一个可以检测Toast消息的应用程序。因为我的手机上会有一个Toast消息大约每天一次,但我无法找到罪魁祸首(服务类)。我以为可能是GMail或Evernote,但它们发送Toast消息的方式略有不同。我打算创建一个应用程序,因为1)我不知道LogCat是否会显示任何内容,2)我不想让我的个人/开发手机一直连接着电脑(因为“发送”消息出现得如此不频繁)。


你完成了你的应用并将其放到Google Play上了吗? - activout.se
@divideandconquer.se 我从未在Google Play上发布过它,因为我只是在追踪问题。但它确实起作用了。该消息来自预安装的Sim Tool Kit。自从Android 4.1以来,我从未关注过Google Play,因为通知会告诉你是哪个应用程序创建了它们。 - JonWillis
5
好的,我会尽力为您翻译。这是需要翻译的内容:“@divideandconquer.se I've made an app out of this question: https://play.google.com/store/apps/details?id=org.mars3142.android.toaster”。 - mars3142
@mars3142,您有更新您出色的应用程序的计划吗?它在Android 10上出现了问题。 - neu242
1
@neu242 啊,我想我错了 -> https://developer.android.com/preview/features/toasts - 后台自定义Toast将被阻止。在八月份我会拿到一部新的安卓11的Pixel手机,所以我应该更新/重写这个应用程序并发布v1.0版本。 - mars3142
显示剩余3条评论
1个回答

18

你可以使用Accessibility Service来捕获消息/通知,可以参考这个。

你可以继承类AccessibilityService并覆盖方法onAccessibilityEvent()来实现类似以下的功能:

public void onAccessibilityEvent(AccessibilityEvent event) {
    if (event.getEventType() != AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED)
        return; // event is not a notification

    String sourcePackageName = (String) event.getPackageName();

    Parcelable parcelable = event.getParcelableData();
    if (parcelable instanceof Notification) {
        // Statusbar Notification
    }
    else {
        // something else, e.g. a Toast message
        String log = "Message: " + event.getText().get(0) 
                   + " [Source: " + sourcePackageName + "]";
        // write `log` to file...
    }
}

注意:在Android 2.2上,这对我没有用,因为它似乎无法捕获Toast,但在Android 4.0+上可以工作。


我会尝试一下,并让您知道结果。 - JonWillis
花了一些时间才让服务正常工作。但它成功了。发送烤面包消息...来自com.android.stk。 - JonWillis
运行得非常好。已经寻找了一段时间。一旦4.0出现,事情有点奇怪,但这个修复了它 :) - Dakun Skye
第二个if语句解决了我的问题,因为在3.0+版本中,辅助功能通过与状态栏通知相同的事件类型发送toast消息,我不知道如何将它们分开。谢谢! - Pilot_51

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