0

具体来说,我有一个令人难以置信的“Droid HTC”,Android 版本 2.2,基带 2.15.00.07.28,内核 2.6.32.17-g9a2fe16,内部版本 3.26.605.1,软件编号 3.26.605.1

我已经安装好 Eclipse 和 Android SDK 并且运行良好。很高兴我可以在 Eclipse 中调试和在我的 Droid 上执行单步代码。

我已经阅读了许多书籍并尝试了所有示例,作为实践,并且正在建立在其他面向对象语言(包括 C++)的多年软件开发经验(> 10 年)的基础上,而不是 Java,但我正在挑选它很快就起来了。

我还下载了在我的“Droid running repo / git”上运行的源代码版本,我一直在研究 FRG83G packages/apps/AccountsAndSyncSettings/src/com/android/settings 代码.

现在。我想编写一个小应用程序,它会在同步失败时通知我。我试图解决的问题是,在我使用 GMail 联系人界面(例如)进行了大量更改之后,'Droid 无法同步它们(可能是删除太多?)。因此,当同步始终失败时,我想显示一个通知栏图标,让我知道此同步失败。如果没有这样的应用程序,它失败的第一个迹象是我可能在 2-3 天后发现缺少联系信息。

因此,逻辑似乎表明我的小应用程序需要成为 SyncStatusObserver 才能在同步操作更改状态时得到通知,然后在该同步上获取 SyncStatusInfo 并注意哪个同步失败以及何时失败。据我所知,这意味着实现一个 SyncStatusObserver 并通过调用 ContentResolver.addStatusChangeListener 将其连接到广播。我已经实现了这一点,并且确实看到了通知消息。

我相信我理解对象模型,因为帐户类型具有零到多个帐户权限,并且每个帐户权限都表示正在同步的数据类型(联系人与日历等)。

SyncStatusObserver 的单一方法 onStatusChanged(final int which) 具有“int which”参数,该参数似乎试图指示哪个帐户类型或哪个帐户权限刚刚更改了它的同步状态。我已经编写并连接了它,并且正在接收这些方法调用,正如人们所期望的那样,当一种类型的数据已同步时。当我的应用程序正在执行时,我在 Eclipse 调试器日志记录窗口中观察到了这一点。

我的问题是如何将单个 int 参数值与帐户类型和/或帐户权限相关联?我想调用 SyncInfo getCurrentSync() 并记录帐户、权限和开始时间。(为什么要开始时间?我们真的不想要结束时间和结束状态吗?)

在 stackoverflow 上搜索,我发现在发布How do do one listen for progress from Android SyncAdapter? SyncStatusObserver 非常无用,因为它不能使用单个整数参数传达非常有用的信息。哦。好的。

我想还有另一种看待这个问题的方法是:在 HTC Incredible 上,当您在主屏幕上并选择菜单 -> 设置 -> 帐户和同步 -> 谷歌(列出的帐户)时,用户界面显示上次成功同步 GMail 帐户的每种帐户类型的时间。获取此信息的代码在哪里,因为这与我所追求的信息相同,并且我想在每次 SyncStatusObserver 的 onStatusChanged 方法调用之后获取此信息。

在发布Syncadapter last update date中,基本上表明当前 Droid 代码没有公开最后同步日期/时间。

有没有其他方法可以获取每个 SyncAdators 的最后成功同步日期/时间?我真的很想抓挠我的痒(可以这么说)。

4

1 回答 1

1
private final SyncStatusObserver mSyncStatusObserver = new SyncStatusObserver() {
    @Override
    public void onStatusChanged(int which) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                String accountName = AccountUtils.getChosenAccountName(HomeActivity.this);
                if (TextUtils.isEmpty(accountName)) {
                    setRefreshActionButtonState(false);
                    return;
                }

                Account account = new Account(accountName, GoogleAccountManager.ACCOUNT_TYPE);
                boolean syncActive = ContentResolver.isSyncActive(
                        account, ScheduleContract.CONTENT_AUTHORITY);
                boolean syncPending = ContentResolver.isSyncPending(
                        account, ScheduleContract.CONTENT_AUTHORITY);
                setRefreshActionButtonState(syncActive || syncPending);
            }
        });
    }
};
于 2012-07-23T03:46:27.533 回答