ContentProvider 不会显示在"数据和同步"区域中



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

具体情况:

我的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);
}

当我加载"活动"时,我从ContentResolver.setIsSyncable得到adb日志,说该帐户已经设置为可同步,所以该方法什么都不做。

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

〔edit〕更多信息:

经过几个小时的调试,我遇到了这个错误:

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类似乎从未被调用过。我应该自己调用它吗?我见过的任何示例或野外应用程序都不会自己调用它,但它们也都有auth组件。想法?

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

其他人注意到答案了吗?

天啊,我讨厌当白痴。

因此,从语义角度来看,提供者不会直接显示在Accounts&同步。取而代之的是,账户显示,提供者显示在他们的详细信息页面上。因此,由于您将SyncAdapter绑定到com.google风格的帐户,同步adapater将显示在您的google帐户中——与"联系人"、"日历"one_answers"Gmail"一起,您应该看到"ClientName Books">

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

android:name

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

因此,它似乎找不到您的BooksProvider类,因为它需要FQCN或通过包的相对路径。

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

最新更新