【问题标题】:In Android, I'm unable to set a Contacts sync adapter to be read-only在 Android 中,我无法将联系人同步适配器设置为只读
【发布时间】:2023-01-15 19:49:13
【问题描述】:

我的应用程序与具有大量自定义属性的自定义服务器同步联系人。因此,它有一个内置的联系人编辑器,用于自己的联系人,我不希望本机联系人应用程序允许编辑这些联系人。我认为在 sync-adapter xml 中设置 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"
    />

我在 Google Pixel 6 (Android 12) 和运行 Android 5.0 的旧平板电脑上试过这个,结果是一样的——如果我在本机联系人应用程序中打开我的一个“自定义”联系人,它允许用户编辑它。但它使用默认的联系人字段集(如拼音名字、中间名和姓氏等),我的服务器不支持这些字段。因此,如果用户实际上在这些字段中输入了任何数据,我的同步适配器就会看到联系人已更改,并尝试将其同步回服务器。

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

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

【问题讨论】:

    标签: android android-contacts android-syncadapter


    【解决方案1】:

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

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

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

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

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

    本机应用程序不会:评估是否设置了 RAW_CONTACT_IS_READ_ONLY。 它既不评估:可能与帐户类型相关联的同步适配器的“supportsUploading”标志

    希望有帮助...

    【讨论】:

      【解决方案2】:

      是的,这是正确的做法。

      几点注意事项:

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

      【讨论】:

      • 请阅读 OP——这是行不通的!我知道它应该可以工作,但仍然允许编辑联系人
      • 这是可能的联系人允许编辑,但不能编辑您自己的原始联系人。阅读我的回答
      • 不,那是不可能的。我已经在完全没有联系人的设备上测试过它,除了我的应用程序创建的那些。因此,没有可以编辑的聚合联系人。我的“原始”联系人是那里唯一的联系人
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 2018-06-07
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多