【问题标题】:What are Android SyncAdapter contentAuthority and accountType?什么是 Android SyncAdapter contentAuthority 和 accountType?
【发布时间】:2014-12-08 23:53:14
【问题描述】:

我正在创建一个自定义 Android SyncAdapter,但在 SDK 示例“SampleSyncAdapter”之后遇到了问题。 - 我正在创建我的 xml/syncadapter.xml 等价物。以下是我感到困惑的部分:

android:contentAuthority="com.android.contacts"
android:accountType="com.example.android.samplesync"

documentation of AbstractThreadedSyncAdapter 声明:

android:contentAuthorityandroid:accountType 属性 指明此同步的内容授权和帐户类型 适配器服务。

文档是循环的,因为它没有说明名称尚未告诉您的内容。我的印象是两者都将以我公司的名称com.acme. 开头,但从那里我一无所知。我怀疑字符串可以是任何东西,只要它们是全局唯一的,以免与同一设备上的任何其他应用程序冲突。我认为这意味着我需要在代码的其他地方使用这些确切的字符串。但是,我想知道,我将在哪里需要这些字符串?!我尝试使用 grep 查找 com.android.contacts,而前面提到的文件是唯一使用它的地方,我可以找到。所以看例子是不可能知道contentAuthority是怎么用的。
如果是这样,我可以将它们都放在字符串资源中并在需要的地方通过资源 ID 引用它们吗?这些属性究竟是什么以及它们是如何使用的?有没有更好的方法来确定我应该为这些和其他领域的应用程序选择什么值?

【问题讨论】:

标签: android xml android-syncadapter reverse-dns


【解决方案1】:

要了解权限是什么,您需要查看documentation of ContentProvider

它声明:“它标识内容提供者。对于第三方应用程序,这应该是一个完全限定的类名(简化为小写)以确保唯一性。权限在元素的权限属性中声明”

帐户类型是您的身份验证器的标识符,例如,AccountManager 的客户端将使用它来调用getAccountsByType(String)

对于SampleSyncAdapter

android:contentAuthority="com.android.contacts"
android:accountType="com.example.android.samplesync"

android:accountType与authenticator定义的一样。

因此 content-Authority 指定将在本地同步哪个内容提供者,而 accountType 指定将使用哪个身份验证器来远程访问数据。 accountType 还用于获取 Sync Adapter 的具体 content-uri。

例如,当您想要开始同步时,您需要像这样调用 requestSync

final Account account = new Account(accountName, ACCOUNT_TYPE);
ContentResolver.requestSync(account, CONTENT_AUTHORITY, new Bundle());

同时为你的同步适配器构建 content-uri,你可以使用类似的东西:

Uri CONTENT_URI = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName).appendQueryParameter(RawContacts.ACCOUNT_TYPE, SyncAdapter.ACCOUNT_TYPE).build();

看看android-sync-adapter


同时,前面提到的 ContentProvider 文档也进行了修订。 latest version 声明:

设计权威

一个提供者通常有一个单一的权限,作为它的 Android 内部名称。为避免与其他提供商发生冲突,您 应使用 Internet 域所有权(反向)作为您的基础 提供者权限。因为这个建议也适用于 Android 包名称,您可以将您的提供者权限定义为 包含提供程序的包的名称的扩展名。为了 例如,如果你的 Android 包名是com.example.<appname>,你 应该给你的供应商授权 com.example.<appname>.provider.

【讨论】:

  • 我不认为这是正确的。这就是为什么。使用小写的完全限定类名与记事本示例 AUTHORITY(“com.google.provider.NotePad”)相矛盾。 contentAuthority 用于 SyncAdapter。完全限定名称不包含“provider”,也不包含大写的记事本。
  • “对于第三方应用程序...”。这意味着记事本使用大写字母并不奇怪。
  • 据我了解,记事本示例是由 Google 编写的,旨在向第三方开发人员展示如何编写应用程序的示例。你是说它是由谷歌编写的,所以他们向第三方开发者展示了一个应用程序,就好像他们在谷歌工作一样?示例中的“提供者”呢?不一致的更简单原因是您描述的链接是在谈论提供者而不是 SyncAdapter。从您的引用中:“权限在元素的权限属性中声明”。请注意,它们描述的是“权威”而不是“contentAuthority”,这是我的问题所在。
  • 赫歇尔是对的。 accountAuthority 引用了哪个 contentProvider 负责这个联结器(例如:联系人)。 accountType 标识您生成的帐户(例如为您的应用程序。Facebook、twitter、last.fm 都创建此类帐户以管理他们“自己的”数据)。名称“提供者”也可以,作为类名的一部分。
【解决方案2】:

SyncAdapter 元数据文件syncadapter.xml 中的android:contentAuthority 属性应与Manifest 中提供者声明的android:authorities 属性相匹配。将此值设置为您的应用程序包名称,并附加字符串“.provider”。这是来自 Android 的开发者网站http://developer.android.com/training/sync-adapters

所以在你的清单中:

<provider
    android:name="com.example.android.datasync.provider.StubProvider"
    android:authorities="com.example.android.datasync.provider"
    android:exported="false"
    android:syncable="true"/>

在你的 syncadapter.xml 中

<sync-adapter
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:contentAuthority="com.example.android.datasync.provider"
    android:accountType="com.android.example.datasync"
    android:userVisible="false"
    android:supportsUploading="false"
    android:allowParallelSyncs="false"
    android:isAlwaysSyncable="true"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多