据我所知,无法直接访问实际消息。我知道的最好方法是使用 Java MAIL for Android 库 (http://code.google.com/p/javamail-android/) 并使用 IMAP 协议来获取您要查找的消息。
但您的实际问题是关于从 gmail 获取事件。要获取它们,您可以使用 ContentObserver。首先,声明你自己的 ContentObserver 子类:
class GmailContentObserver extends ContentObserver {
public GmailContentObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
onChange(selfChange, null);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
// This is where you will get your change notifications
// for each received e-mails. This method will be called multiple times per
// received e-mail. At least 3, but it depends on the way you register
// your observer and on your gmail account set up (number of labels).
// You will also get calls for other events. Remember that this method is
// called for any change on the local gmail repository. Receiving an e-mail
// is only one of many actions that will change this repository.
Toast.makeText(MainActivity.this,"gmail event",Toast.LENGTH_LONG).show();
}
}
然后注册你的 ContentObserver:
GmailContentObserver gco = new GmailContentObserver(new Handler());
ContentResolver cr = getContentResolver();
cr.registerContentObserver(Uri.parse("content://gmail-ls"),true,gco);
就是这样!
请注意,当您不再需要观察者或您的应用程序/服务关闭时,您还应该取消注册观察者。
在实例化观察者时还要注意new Hanlder()。这将确定在哪个线程上调用 onChange 方法。创建 Handler 对象的线程是调用 onChange 的线程(在我的示例中,您看不到这一点,但它是 UI 线程,即在我的 Activity 中调用 onCreate 的线程)。
注册观察者时,有两个参数:要观察的 URI 和是否要观察后代。在上面的示例代码中,您将收到有关 URI content://gmail-ls 的通知,但也将收到例如 content://gmail-ls/foo@gmail.com 的通知,foo@gmail.com 是您的 gmail 帐户。还有更多的后代 URI(尤其是标签)。要获得更少的事件,您可以为 content://gmail-ls/foo@gmail.com 注册观察者并将第二个参数设置为 false。
鉴于这种机制,理论上如果您想观察给定 gmail 标签的变化,您可以查询标签 id(请参阅 gmail api)并注册相应的 URI content://gmail-ls/foo@gmail.com/label/80,80 是标签 id。但由于某种原因,这不起作用。
还要检查已经提到的 gmail api 的代码,以确定已安装的 gmail 应用程序是否具有内容提供程序(取决于 gmail 的版本)。