将联系人插入Samsung I9000 Galaxy S会返回异常

时间:2011-04-12 08:55:53

标签: android

我有这个代码用于插入在所有HTC设备上测试的联系人,它似乎工作正常,直到我在三星I9000 Galaxy S上尝试它,这给了我一个特定代码行的java.lang.NullPointerException

String strDisplayName = "First Name" + " " + "LastName";
values.put(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, strDisplayName);
Uri rawContactUri = context.getContentResolver().insert(RawContacts.CONTENT_URI, values); //java.lang.NullPointerException here

似乎这个URI不存在,或者三星在插入联系人时有不同的方式。有没有人在三星Galaxy设备上体验过这个?请分享您的想法。

由于

2 个答案:

答案 0 :(得分:1)

您正在插入RawContacts但是没有列DISPLAY_NAME列。这是RawContacts.Data实体的一部分。 您的插入内容应如下所示:

ArrayList<ContentProviderOperation> ops =
          new ArrayList<ContentProviderOperation>();

 int rawContactInsertIndex = ops.size();
 ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
          .build());

 ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
          .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
          .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
          .withValue(StructuredName.DISPLAY_NAME, strDisplayName)
          .build());

 getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

此代码不会在所有设备上运行,因为您还应指定和帐户创建联系人。您要在哪里创建联系人?电话联系?一个谷歌联系人? IIRC我认为在Galaxy S上创建一个电话联系人你应该将帐户类型和名称设置为空白(不为空)。这会将第一次操作改为:

 ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
          .withValue(RawContacts.ACCOUNT_TYPE, "")
          .withValue(RawContacts.ACCOUNT_NAME, "")
          .build());

答案 1 :(得分:0)

调试时,您可以“监视”变量,也可以测试空变量。

此外,还缺少代码:来自哪里的行为(=活动?),那可能就是NULL。