我有这个代码用于插入在所有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设备上体验过这个?请分享您的想法。
由于
答案 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。