2012-11-27 70 views
5

在我的應用程序中,我點擊了一個名爲Pick Photo的按鈕,並加載了庫。當我在畫廊單擊圖像,應用程序強制關閉,並在我的logcat我收到以下:java.lang.RuntimeException:未能將結果ResultInfo {who = null,request = 1,result = -1,data = intent}複製到活動

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://media/external/images/media/3369 (has extras) }} to activity {cap.shot/cap.shot.LolcatActivity}: java.lang.NullPointerException 
    at android.app.ActivityThread.deliverResults(ActivityThread.java:2655) 
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:2697) 
    at android.app.ActivityThread.access$2000(ActivityThread.java:124) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:998) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3806) 
    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) 
    Caused by: java.lang.NullPointerException 
    at cap.shot.LolcatView.loadFromUri(LolcatView.java:137) 
    at cap.shot.LolcatActivity.loadPhoto(LolcatActivity.java:384) 
    at cap.shot.LolcatActivity.onActivityResult(LolcatActivity.java:299) 
    at android.app.Activity.dispatchActivityResult(Activity.java:3988) 
    at android.app.ActivityThread.deliverResults(ActivityThread.java:2651) 

我lolcatactivity.java可以在這裏找到:http://pastebin.com/AVL8CswT 我lolcatview.java可以在這裏找到:http://pastebin.com/vD7vCBgY

謝謝!

+1

這是所有logcat的錯誤?具有諷刺意味的是,在評論'// TODO:可以安全地假設這將永遠是一個BitmapDrawable?'後,你的應用崩潰了,顯然答案是:「不」。 – Sam

+0

它說「... ...更多」,但我看不到它們。你有什麼想法如何解決它? – Jack

回答

3

getDrawable在你的情況下返回null。 您用於setImageURI的uri可能無效,因此您將收到空值。

對drawable執行null檢查,如果drawable爲null,則需要保釋。

編輯:

if(drawable == null) 
    return; 
+0

如何爲drawable執行nullcheck。如果它爲空,請解釋「你需要保釋」。 – Jack

+0

我已編輯,在第139行之前添加 – nandeesh

+0

好吧,我加了它,它不會再怪你了!有一個更新,但更容易的問題。一些圖像超過了我的虛擬機預算,所以我得到一個java.lang.OutofMemoryError。如何提高我的虛擬機預算,以便可以使用更多圖像? – Jack

1

我檢查你的代碼,所以我認爲你需要替換這樣

private static final int SELECT_PHOTO = 100 

        Intent photoPickerIntent = new Intent(
          Intent.ACTION_PICK); 
        photoPickerIntent.setType("image/*"); 
        startActivityForResult(photoPickerIntent, SELECT_PHOTO); 

,並在您開始活動成果的按鈕動作給

@Override 
protected void onActivityResult(int requestCode, int resultCode, 
     Intent imageReturnedIntent) { 
    System.out.println("requestcode" + requestCode + "result code " 
      + requestCode + "intentt" + imageReturnedIntent); 

    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    switch (requestCode) { 
    case SELECT_PHOTO: 
     if (resultCode == RESULT_OK) { 

      // InputStream imageStream; 
      try { 
       Uri selectedImage = imageReturnedIntent.getData(); 
       Bitmap yourSelectedImage = decodeUri(selectedImage); 
       // imageStream = getContentResolver().openInputStream(
       // selectedImage); 
       // Bitmap yourSelectedImage = BitmapFactory 
       // .decodeStream(imageStream); 
       try { 
        yourimageview.setImageBitmap(yourSelectedImage); 
        picArray = convertBitmap(yourSelectedImage); 
        String imagepath_new = getRealPathFromURI(selectedImage); 

        System.out.println("gakk" + imagepath_new); 
        String[] s = imagepath_new.split("/"); 
        System.out.println(s[s.length - 1]); 
        String imageName1 = s[s.length - 1]; 
        imageName1 = imageName1.replace(" ", ""); 

       } catch (Exception e) { 
        Toast.makeText(getApplicationContext(), 
          "Exception" + e, 1000).show(); 
       } 

      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
     break; 

並添加這些行以避免內存泄漏,同時在活動中顯示圖像視圖。

private byte[] convertBitmap(Bitmap bm) { 
    // int bytes = bm.getWidth() * bm.getHeight() * 4; // calculate how many 
    // bytes our image 
    // consists of. Use a 
    // different value than 
    // 4 if you don't use 
    // 32bit images. 

    // ByteBuffer buffer = ByteBuffer.allocate(bytes); // Create a new 
    // buffer 
    // bm.copyPixelsToBuffer(buffer); // Move the byte data to the buffer 

    // byte[] array = buffer.array(); // Get the underlying array containing 
    // the data. 

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    bm.compress(Bitmap.CompressFormat.PNG, 100, stream); 

    byte[] array = stream.toByteArray(); 
    return array; 
} 

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException { 

    // Decode image size 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(
      getContentResolver().openInputStream(selectedImage), null, o); 

    // The new size we want to scale to 
    final int REQUIRED_SIZE = 140; 

    // Find the correct scale value. It should be the power of 2. 
    int width_tmp = o.outWidth, height_tmp = o.outHeight; 
    int scale = 1; 
    while (true) { 
     if (width_tmp/2 < REQUIRED_SIZE || height_tmp/2 < REQUIRED_SIZE) { 
      break; 
     } 
     width_tmp /= 2; 
     height_tmp /= 2; 
     scale *= 3; 
    } 

    // Decode with inSampleSize 
    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o2.inSampleSize = scale; 
    return BitmapFactory.decodeStream(
      getContentResolver().openInputStream(selectedImage), null, o2); 

} 

public String getRealPathFromURI(Uri contentUri) { 

    // can post image 
    String[] proj = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = managedQuery(contentUri, proj, // Which columns to 
                // return 
      null, // WHERE clause; which rows to return (all rows) 
      null, // WHERE clause selection arguments (none) 
      null); // Order-by clause (ascending by name) 
    int column_index = cursor 
      .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 

    return cursor.getString(column_index); 

} 

private Bitmap decodeFile(File f) { 
    Bitmap b = null; 
    try { 
     // Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 

     FileInputStream fis = new FileInputStream(f); 
     BitmapFactory.decodeStream(fis, null, o); 

     fis.close(); 

     int scale = 10; 
     // Decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     fis = new FileInputStream(f); 
     b = BitmapFactory.decodeStream(fis, null, o2); 
     fis.close(); 
    } catch (IOException e) { 

    } 
    return b; 
} 

希望這個預訂購幫助你

+0

@nandeesh給了我一個解決方案已經。雖然我想嘗試你的,因爲希望它會修補內存泄漏。 – Jack

+0

我應該在哪裏添加位圖轉換器? – Jack

+0

對於遲到的重播,您會看到decodeFile(File f),它會減小圖片大小 – Ramz

相關問題