【问题标题】:How to add a phone number to a contact programmatically in Android?如何在 Android 中以编程方式将电话号码添加到联系人?
【发布时间】:2011-12-17 01:00:16
【问题描述】:

我有一个可以添加和删除联系人的应用程序。如果现有联系人中存在现有值,则可以对其进行修改。但我似乎无法将新值插入现有联系人。例如,如果家庭电话号码存在现有值,但工作电话号码不存在,我尝试使用填充来添加值(传递了cintact idValueworkNumber):

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValue(ContactsContract.Data.CONTACT_ID, idValue)
            .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, workNumber)
            .build());
    getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

但我得到一个 NullPointerException:

java.lang.NullPointerException
    at com.android.providers.contacts.ContactsProvider2.insertData(ContactsProvider2.java:2604)
    at com.android.providers.contacts.ContactsProvider2.insertInTransaction(ContactsProvider2.java:2452)
    at com.android.providers.contacts.SQLiteContentProvider.insert(SQLiteContentProvider.java:106)
    at com.android.providers.contacts.ContactsProvider2.insert(ContactsProvider2.java:2256)
    at android.content.ContentProviderOperation.apply(ContentProviderOperation.java:214)
    at com.android.providers.contacts.SQLiteContentProvider.applyBatch(SQLiteContentProvider.java:216)
    at com.android.providers.contacts.ContactsProvider2.applyBatch(ContactsProvider2.java:2290)
    at android.content.ContentProvider$Transport.applyBatch(ContentProvider.java:217)
    at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:194)
    at android.os.Binder.execTransact(Binder.java:336)
    at dalvik.system.NativeStart.run(Native Method)

谁能告诉我我做错了什么?

【问题讨论】:

    标签: android insert contacts edit


    【解决方案1】:

    您遇到了错误,因为 Android 不允许您将联系人直接添加到您的联系人表中。相反,您需要修改或添加原始联系人,Android 会自动为您创建联系人。

    【讨论】:

      【解决方案2】:

      你不见了withValue(Phone.TYPE, Phone.TYPE_WORK)

      ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
      ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
              .withValue(ContactsContract.Data.RAW_CONTACT_ID, idValue)
              .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
              .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, workNumber).
      withValue(Phone.TYPE, Phone.TYPE_WORK)
              .build());
      getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
      

      编辑

      你是对的,我检查了data 表的架构,如下所示,它只使用原始联系人 ID,而不是联系人 ID

      CREATE TABLE data (_id INTEGER PRIMARY KEY AUTOINCREMENT,
      package_id INTEGER REFERENCES package(_id),
      mimetype_id INTEGER REFERENCES mimetype(_id) NOT NULL,
      raw_contact_id INTEGER REFERENCES raw_contacts(_id) NOT NULL,
      is_primary INTEGER NOT NULL DEFAULT 0,
      is_super_primary INTEGER NOT NULL DEFAULT 0,
      data_version INTEGER NOT NULL DEFAULT 0,
      data1 TEXT,
      data2 TEXT,
      data3 TEXT,
      data4 TEXT,
      data5 TEXT,
      data6 TEXT,
      data7 TEXT,
      data8 TEXT,
      data9 TEXT,
      data10 TEXT,
      data11 TEXT,
      data12 TEXT,
      data13 TEXT,
      data14 TEXT,
      data15 TEXT,
      data_sync1 TEXT, 
      data_sync2 TEXT, 
      data_sync3 TEXT, 
      data_sync4 TEXT );
      

      【讨论】:

      • 谢谢,那是我的愚蠢,但这并没有导致问题。我已经更新了原始帖子中的代码,但仍然出现错误。
      • 现在看来你的问题不在这行了。
      • 你这是什么意思?代码抛出异常——这怎么可能是我的问题?
      • 这意味着我已经完成了相同的代码,它工作正常。调试代码或放置日志并找到错误的确切位置。
      • 感谢您的帮助 - 我找到了问题,由于某种原因,它没有通过 CONTACT_ID 找到联系人,而是想要 RAW_CONTACT_ID。我真的很想接受你的回答并给你分数,但我不能以目前的方式来做到这一点。你能不能把它改成“.withValue(ContactsContract.Data.RAW_CONTACT_ID, idValue)”,然后我就接受了
      猜你喜欢
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 2012-02-24
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多