2013-01-11 39 views
0

我想通過代碼更新android中的聯繫人照片。使用內容提供者操作我試圖更新照片。更新查詢的代碼片段中添加。但沒有任何反應。我的代碼片段如下。獲取nullPointerException與contentprovideroperation

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == 1 && data != null) 

    { 

     Uri contactData = data.getData(); 

     String[] projection = new String[] { Data.RAW_CONTACT_ID, 
       Photo.PHOTO }; 

     Cursor c = getContentResolver().query(Data.CONTENT_URI, projection, 
       null, null, null); 

     if (c.moveToFirst()) { 

      String dataid = c.getString(c 
        .getColumnIndex(Data.RAW_CONTACT_ID)); 
      String first = String.valueOf(dataid); 

      byte[] dataid1 = c.getBlob(c.getColumnIndex(Photo.PHOTO)); 
      String first1 = String.valueOf(dataid1); 
      System.out.println("fisttry"); 
      System.out.println(dataid); 
      System.out.println(first); 
      System.out.println(first1); 
      System.out.println(dataid1); 

      try { 

       System.out.println("fisttry"); 
       ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

       ContentProviderOperation.Builder op = ContentProviderOperation 
         .newUpdate(ContactsContract.Data.CONTENT_URI); 

       op.withSelection(
         ContactsContract.Data.RAW_CONTACT_ID + "=?" 
           + " AND " + ContactsContract.Data.MIMETYPE 
           + "=?", 
         new String[] { 
           String.valueOf(dataid), 
           ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE }); 
       op.withValue(
         ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); 
       op.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, 
         photo); 

       ops.add(op.build()); 
       System.out.println(op); 
       System.out.println(ops); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      // Update 

      try { 
       this.getContentResolver().applyBatch(
         ContactsContract.AUTHORITY, ops); 
       System.out.println("secondtry"); 
      } catch (RemoteException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (OperationApplicationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


     } 
    } 



} 

堆棧跟蹤:

01-12 01:19:22.202: E/AndroidRuntime(16057): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/0r69-303A36303A365A/71 (has extras) }} to activity {com.ileaf.camerafun/com.ileaf.camerafun.TrialActivity}: java.lang.NullPointerException 
01-12 01:19:22.202: E/AndroidRuntime(16057): at android.app.ActivityThread.deliverResults(ActivityThread.java:3521) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3563) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at android.app.ActivityThread.access$2800(ActivityThread.java:126) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2068) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at android.os.Looper.loop(Looper.java:123) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at android.app.ActivityThread.main(ActivityThread.java:4633) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at java.lang.reflect.Method.invokeNative(Native Method) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at java.lang.reflect.Method.invoke(Method.java:521) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at dalvik.system.NativeStart.main(Native Method) 
01-12 01:19:22.202: E/AndroidRuntime(16057): Caused by: java.lang.NullPointerException 
01-12 01:19:22.202: E/AndroidRuntime(16057): at android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:454) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:95) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at android.content.ContentResolver.applyBatch(ContentResolver.java:622) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at com.ileaf.camerafun.TrialActivity.onActivityResult(TrialActivity.java:513) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at android.app.Activity.dispatchActivityResult(Activity.java:3890) 
01-12 01:19:22.202: E/AndroidRuntime(16057): at android.app.ActivityThread.deliverResults(ActivityThread.java:3517) 
01-12 01:19:22.202: E/AndroidRuntime(16057): ... 11 more 
+3

現在一起:「發佈堆棧跟蹤」。 – trojanfoe

+0

請告訴我們'TrialActivity'的513。 – WarrenFaith

+0

我建議你修改你的代碼。您正在爲'Data.CONTENT_URI'中的所有條目執行大量'applyBatch'調用。 – Luksprog

回答

0

這是一個活動的生命週期的問題。當您調用startActivityForResult()時,啓動活動會暫停,並且如果Android缺乏資源,可能會被完全銷燬。

當您從開始的活動返回時,調用onActivityResult()發生在活動週期的早期 - 例如要「getActivity)(」內onActivityResult()來電片段將返回null如果活動實際上是破壞,但如果未銷燬則返回非空值。

因此,您不能在onActivityResult()方法中可靠地做任何事情。我在這裏使用了兩種模式。第一種方法是僅使用onActivityResult()將實例變量中的響應存儲起來,然後在onResume()方法中執行操作;第二種是有條件地執行代碼:

@Override 
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 

    if (getActivity() != null) { 
     // as we have an activity, it wasn't destroyed, and we can do stuff here 
    } 


} 

您使用的解決方案取決於您正在處理的場景。當通過數據意圖返回瞬態數據時(因爲這是我獲得它的唯一方式),我使用第一種解決方案,第二種情況是當調用onActivityResult()只是一個通知,我應該刷新其他地方存儲的數據的視圖。