我正在尝试让一个自定义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级测试(似乎没有抛出任何形式的权限异常——我希望他们能解决这个问题。希望这能帮助到别人。