在 Android 中,我无法将通讯录同步适配器设置为只读



我的应用程序与自定义服务器同步联系人,具有许多自定义属性。正因为如此,它为自己的联系人提供了一个内置的联系人编辑器,我不希望本机联系人应用允许编辑这些联系人。我认为在sync-adapterxml中设置android:supportsUploading="false"会做我想要的,但它没有。下面是完整的XML文件:

<sync-adapter
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.myapp.ContactSync"
android:contentAuthority="com.android.contacts"
android:userVisible="false"
android:supportsUploading="false"
android:allowParallelSyncs="false"
android:isAlwaysSyncable="false"
/>

我在谷歌Pixel 6 (Android 12)和一台运行Android 5.0的旧平板电脑上试过,结果是一样的——如果我打开我的一个"自定义"在原生联系人应用中,它允许用户编辑它。但是它使用的是默认的联系人字段集(如Phonetic First、Middle和Last names等),我的服务器不支持这些字段集。因此,如果用户实际上在这些字段中输入了任何数据,我的同步适配器将看到联系人被更改,并尝试将其同步回服务器。

正如我所说,我的目标是只允许在我的应用程序中编辑这些联系人。这可以做到吗?

编辑:澄清一下,我已经排除了这是联系人聚合的某种错误的可能性。我在多个设备上进行了测试,其中没有加载其他联系人,只有我的应用程序添加的联系人。我还尝试为每个联系人设置AGGREGATION_MODE_DISABLED,但这并没有解决问题。

我偶然发现了同样的问题,这是你实际要求的:

本机Contacts应用程序决定RawContact在此函数中是否为只读:参https://android.googlesource.com/platform/packages/apps/Contacts/+//头/主/src/com/android/contacts/editor/ContactEditorFragment.java # 962

相关部分是被调用的函数areContactsWritable():https://android.googlesource.com/platform/packages/apps/ContactsCommon/+/4 e3a17eaeced54b154b76a42d050fdd9b4ac7c02/src/com/android/contacts/common/model/account/ExternalAccountType.java # 238

结果取决于对应的AccountType在其XML声明中是否有EditSchema:mHasEditSchema:https://android.googlesource.com/platform/packages/apps/ContactsCommon/+/4 e3a17eaeced54b154b76a42d050fdd9b4ac7c02/src/com/android/contacts/common/model/account/ExternalAccountType.java # 363

因此,在我的场景中,只需从我的contacts.xml(包含ContactsAccountType/ContactsSource的文件)中删除EditSchema就可以了,RawContact现在是只读的。如果用户试图修改联系人(编辑按钮保持活动状态),联系人编辑器将在另一个帐户(例如google)中创建第二个链接的RawContact。

本机应用程序不评估RAW_CONTACT_IS_READ_ONLY是否设置。它都不求值:"supportsUploading"可能与帐户类型

相关联的同步适配器的标志。希望对你有帮助。

是的,这是正确的做法。

一些笔记:

  1. 您可以使用这里的代码来确保您的SyncAdapter确实被识别为只读SyncAdapter,并确保您在RawContacts中使用的ACCOUNT_NAME和ACCOUNT_TYPE是正确的
  2. 确保SyncAdapter只创建/更新自己的RawContacts,而不是其他SyncAdapter的Raws。
  3. 记住,一个联系人可能包含多个RawContact,一个来自SyncAdapter,另一个来自其他应用程序(例如Google)。所以当读取一个修改过的联系人,你应该只从你自己的RawContact中读取,这样你就不会读取那些可能被用户编辑过的不支持的字段。

最新更新