5

我正在尝试让自定义 ContentProvider 显示在数据和同步下,但遇到了一些问题。也就是说,它没有出现。

具体情况:

我的 AndroidManifest.xml 有提供者和服务:

<provider android:name="BooksProvider"
    android:label="ClientName Books"
    android:authorities="com.clientname.reader.books"
    android:enabled="true"
    android:exported="true"
    android:syncable="true">
    <grant-uri-permission android:pathPattern=".*" />
</provider>
<service android:name=".sync.SyncService"
     android:exported="true" android:process=":sync">
    <intent-filter>
        <action android:name="android.content.SyncAdapter" />
    </intent-filter>
    <meta-data android:name="android.content.SyncAdapater"
         android:resource="@xml/syncadapter" />
</service>

res/xml/syncadapter.xml 有以下内容:

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
     android:contentAuthority="com.clientname.reader.books"
     android:accountType="com.google"
     android:supportsUploading="true"
     android:userVisible="true"
/>

为了安全起见,我什至在 onCreate 上调用了以下代码:

AccountManager accountManager = AccountManager.get(getApplicationContext());
Account[] accounts = accountManager.getAccountsByType("com.google");
for(Account account : accounts){
    Log.d(TAG, "Account: " + account.name);
    ContentResolver.setIsSyncable(account, Reader.AUTHORITY, 1);
}

当我加载 Activity 时,我从 ContentResolver.setIsSyncable 获得 adb 日志记录,说该帐户已设置为可同步,因此该方法没有执行任何操作。

然而,提供商拒绝出现在设置 > 帐户和同步 > 数据和同步中。关于为什么的任何想法?有谁知道它是如何确定该部分中出现的内容的?

[编辑] 更多信息:

花了几个小时调试后,我遇到了这个错误:

04-11 10:46:02.370: DEBUG/SyncManager(105): can't find a sync adapter for SyncAdapterType Key {name=com.clientname.reader.books, type=com.google}, removing settings for it

看来我的 SyncService 类实际上从未被调用过。我应该自己调用它吗?我见过的任何示例或野外应用程序都没有自己调用它,但它们也都具有身份验证组件。想法?

4

3 回答 3

4
<meta-data android:name="android.content.SyncAdapater"
     android:resource="@xml/syncadapter" />

其他人注意到答案了吗?

天啊,我讨厌做白痴。

于 2011-04-12T05:18:14.703 回答
3

因此,从语义的角度来看,提供者不会直接出现在 Accounts & Sync 中。取而代之的是,账户出现,提供者出现在他们的详细信息页面上。因此,由于您将 SyncAdapter 绑定到 com.google 样式帐户,同步适配器将显示在您的 google 帐户中 - 除了“联系人”、“日历”和“Gmail”,您应该看到“ClientName Books”

但是,您真正的问题是您的 XML。根据AndroidManifest.xml 文档

android:name

实现服务的服务子类的名称。这应该是一个完全限定的类名(例如,“com.example.project.RoomService”)。但是,作为简写,如果名称的第一个字符是句点(例如,“.RoomService”),则将其附加到指定的包名称中

因此,看起来它没有找到您的BooksProvider类,因为它需要 FQCN 或通过您的包的相对路径。

于 2011-04-13T11:47:30.493 回答
2

正如我最终发现的那样,ContentProvider 可能未显示在同步设置屏幕下的另一个原因是清单中缺少android.permission.WRITE_SYNC_SETTINGS权限。不幸的是,我读过的所有教程、文章和文档都忽略了这一点,或者没有明确概述。此外,该平台(在 API 级别 13 下测试)似乎没有抛出任何形式的权限异常——我希望他们能解决这个问题。希望这可以帮助某人。

于 2011-12-07T02:47:28.727 回答