什么是Android SyncAdapter contentAuthority和accountType?

Mit*_*tch 6 xml android reverse-dns android-syncadapter

我正在创建一个自定义的Android SyncAdapter,并在SDK示例"SampleSyncAdapter"之后遇到麻烦.- 我正在创造我的相当于xml/syncadapter.xml.这是我困惑的部分:

android:contentAuthority="com.android.contacts"
android:accountType="com.example.android.samplesync"
Run Code Online (Sandbox Code Playgroud)

AbstractThreadedSyncAdapter文档指出:

android:contentAuthorityandroid:accountType属性指出哪些内容权威,哪些帐户类型此同步适配器提供.

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

kin*_*ton 5

要了解权限,您需要查看ContentProvider文档:

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

帐户类型是您的身份验证器的标识符,将由AccountManager的客户端用于调用getAccountsByType(String).

对于SampleSyncAdapter:

android:contentAuthority="com.android.contacts"
android:accountType="com.example.android.samplesync"
Run Code Online (Sandbox Code Playgroud)

android:accountType与验证者定义的那个相同.

因此,内容权限指定将在本地同步哪个内容提供者,而accountType指定将使用哪个身份验证器远程访问数据.accountType还用于获取同步适配器的特定内容-uri.

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

final Account account = new Account(accountName, ACCOUNT_TYPE);
ContentResolver.requestSync(account, CONTENT_AUTHORITY, new Bundle());
Run Code Online (Sandbox Code Playgroud)

同时为您的同步适配器构建content-uri,您可以使用以下内容:

Uri CONTENT_URI = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName).appendQueryParameter(RawContacts.ACCOUNT_TYPE, SyncAdapter.ACCOUNT_TYPE).build();
Run Code Online (Sandbox Code Playgroud)

看看android-sync-adapter


同时,前面提到的ContentProvider文档已经过修改.在最新版本的状态:

设计权威

提供程序通常具有单个权限,该权限用作其Android内部名称.为避免与其他提供程序冲突,您应使用Internet域所有权(反向)作为提供程序权限的基础.由于此建议对于Android程序包名称也是如此,因此您可以将提供程序权限定义为包含提供程序的程序包名称的扩展名.例如,如果您的Android软件包名称是com.example.<appname>,您应该授予您的提供商权限 com.example.<appname>.provider.