2011-06-20 60 views
3

我已經使用一些代碼來創建一個簡單的應用程序,以允許添加聯繫人詳細信息。代碼非常簡單,並且在模擬器以及我擁有的許多設備上都可以正常工作,除了全新的HTC Sensation。在HTC Sensation上的NPE,在模擬器中工作

下面是代碼:

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中運行良好,但在運行相同的電話上運行得並不好。

感謝 約翰

+2

Parcel.java中的1328行是哪一行? –

回答

0

檢查哪些代碼是指

androidfun.getthatnumber.mainActivity.saveCallContact(mainActivity.java:157)的行

還應該有更合你的logcat,一Caused by等等,通常更直接地指向錯誤的代碼。

+0

最後一段不適用於這種情況 - 「NullPointerException」通常不包含更基本的異常,因爲它幾乎總是由VM檢測到空引用的解引用引起的。 –

+0

夠公平的。 157行仍然是開始挖掘的地方。 ;)它看起來像來自build()語句之一,因爲堆棧跟蹤顯示它挖掘到contentresolver和db。 – yep

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常量CommonDataKinds.Phone.TYPE_MOBILE(該值可能會不同廠商之間的變化), 第二,確保你正在使用withValue按鍵則有與您給予的類型相同(不確定'null'是否合法ACCOUNT_TYPE),並打印修剪後的字符串以確保它們具有有意義的值。

希望這會有所幫助!

0

我有兩個HTC設備的相同問題。 對我來說,解決這個問題的方法是在最後的數據輸入中添加更多的值(我已經添加了五個以上,其他則是原始聯繫人ID,電話號碼和MIME類型)。 我不知道它爲什麼現在有效,但它確實如此。

相關問題