2012-11-27 18 views
5

Nella mia app premo un pulsante chiamato Scegli foto e carica la galleria. Quando scatto una foto nella galleria, la forza di applicazione si chiude e nella mia logcat ricevo il seguente:java.lang.RuntimeException: Risultato di consegna non riuscito ResultInfo {who = null, request = 1, result = -1, data = intent} all'attività

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) 

mio lolcatactivity.java è disponibile qui: http://pastebin.com/AVL8CswT mio lolcatview.java è disponibile qui: http://pastebin.com/vD7vCBgY

Grazie!

+1

È questo tutti gli errori Logcat? Ironia della sorte l'app si blocca subito dopo il commento '// TODO: è sicuro assumere che questo sarà sempre un BitmapDrawable?', Apparentemente la risposta è: "no". – Sam

+0

Dice "... 11 altro" ma non riesco a vederli. Hai qualche idea su come risolverlo? – Jack

risposta

3

getDrawable restituisce null nel tuo caso. L'uri che stai utilizzando per setImageURI potrebbe non essere valido, quindi stai ricevendo null.

Fare un controllo nullo per il drawable, se drawable è nullo, è necessario eseguire il bail.

Edit:

if(drawable == null) 
    return; 
+0

Come posso fare un nullcheck per disegnabile. E se è nullo, spiega "hai bisogno di liberarti". – Jack

+0

ho modificato, aggiungi prima riga 139 – nandeesh

+0

Ok l'ho aggiunto, non è più strano! C'è un problema nuovo ma più semplice. Alcune immagini superano il budget della mia macchina virtuale, quindi ottengo un java.lang.OutofMemoryError. Come posso aumentare il mio budget VM in modo che possa utilizzare più immagini? – Jack

1

ho controllato il codice in modo penso che è necessario sostituire la vostra azione pulsante mi piace questo

private static final int SELECT_PHOTO = 100 

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

e nella vostra Inizio risultato di attività forniscono

@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; 

E aggiungere anche queste righe per evitare perdite di memoria mentre si visualizza la vista dell'immagine nell'Attività.

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; 
} 

speranza questo willl aiutare

+0

@nandeesh mi ha dato una soluzione già. Anche se voglio provare il tuo perché spero che si patch la perdita di memoria. – Jack

+0

dove dovrei aggiungere il convertitore bitmap? – Jack

+0

scusa per il replay in ritardo si vede il file decode (File f) che riduce le dimensioni dell'immagine – Ramz