ContentProvider不会出现在Data&同步区域

时间:2011-04-11 09:13:34

标签: android android-contentprovider android-syncadapter

我正在尝试将自定义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);
}

当我加载Activity时,我从ContentResolver.setIsSyncable获取adb日志,说该帐户已经设置为可同步,因此该方法没有做任何事情。

然而,提供商拒绝以显示在设置&gt;账户&amp;同步&gt;数据&amp;同步。有什么想法吗?任何人都知道如何确定该部分中出现的内容?

[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组件。想法?

3 个答案:

答案 0 :(得分:4)

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

有没有人注意到答案?

上帝,我讨厌做个白痴。

答案 1 :(得分:3)

因此,从语义角度来看,提供商不会直接显示在账户和账户中。同步。相反,帐户显示,其详细信息页面上有提供程序。因此,由于您将SyncAdapter绑定到com.google样式帐户,同步适配器将显示在您的Google帐户中 - 除了“联系人”,“日历”和“Gmail”之外,您还应该看到“ClientName Books”

但是,您真正的问题是您的XML。每AndroidManifest.xml docs

  

android:name

     

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

所以,看起来它没有找到你的BooksProvider类,因为它需要FQCN或你的包的相对路径。

答案 2 :(得分:2)

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