HTC Sensation上的NPE,可在仿真器中运行

时间:2011-06-20 15:02:51

标签: java android nullpointerexception

我使用了一些代码来创建一个简单的应用程序,以允许添加联系人详细信息。代码非常简单,在模拟器和我拥有的许多设备上运行良好,除了新的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中运行良好,但在运行相同的手机上运行不正常。

由于 约翰

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之外)。 我不知道为什么它现在有用,但确实如此。