我使用了一些代码来创建一个简单的应用程序,以允许添加联系人详细信息。代码非常简单,在模拟器和我拥有的许多设备上运行良好,除了新的HTC Sensation。
以下是代码:
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = ops.size();
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)
.withValue(RawContacts.ACCOUNT_NAME, null)
.build());
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE)
.withValue(Phone.NUMBER, number.getText().toString().trim())
.withValue(Phone.TYPE, "TYPE_MOBILE")
.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, name.getText().toString().trim())
.build());
try {
ContentProviderResult[] res = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OperationApplicationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
当我运行它时,我得到以下内容:
java.lang.NullPointerException
at android.os.Parcel.readException(Parcel.java:1328)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)
at android.database.DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel(DatabaseUtils.java:137)
at android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:491)
at android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:95)
at android.content.ContentResolver.applyBatch(ContentResolver.java:641)
at uk.co.androidfun.getthatnumber.mainActivity.saveCallContact(mainActivity.java:157)
at uk.co.androidfun.getthatnumber.mainActivity$3.onClick(mainActivity.java:74)
at android.view.View.performClick(View.java:2532)
at android.view.View$PerformClick.run(View.java:9277)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4196)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
我看了看代码并看不到问题,正如我说的那样在模拟器运行2.3.3中运行良好,但在运行相同的手机上运行不正常。
由于 约翰
答案 0 :(得分:1)
我知道这是一个老问题,但我也被那个奇怪的NPE所击中,所以这可能对某人有帮助。
经过一番挖掘后,我发现我给newInsert
的一个值是错误的类型(该死的重构!)
我有:
String val = ...;
builder.withValue(Data.RAW_CONTACT_ID, val);
而不是:
long val = ...;
builder.withValue(Data.RAW_CONTACT_ID, val);
修复解决了NPE。
因此,查看您的代码,我首先将“TYPE_MOBILE”更改为Android const CommonDataKinds.Phone.TYPE_MOBILE
(因为此值可能会在不同的供应商之间发生变化),
其次,确保您在withValue
中使用的所有密钥与您提供的密钥具有相同的类型(不确定'null'对于ACCOUNT_TYPE
是合法的),并将修剪后的字符串打印到确保他们有有意义的价值观。
希望这有帮助!
答案 1 :(得分:0)
检查哪些代码引用
行androidfun.getthatnumber.mainActivity.saveCallContact(mainActivity.java:157)
你的logcat还应该有更多,Caused by
等等,通常更直接地指向坏代码。
答案 2 :(得分:0)
我遇到了两个HTC设备的问题。 为我解决的是在最后一个数据条目中添加更多值(我已经添加了五个以上,除了原始联系人ID,电话号码和mime tyep之外)。 我不知道为什么它现在有用,但确实如此。