2012-11-27 15 views
5

In meiner App klicke ich auf eine Schaltfläche mit der Bezeichnung Foto auswählen und lädt die Galerie. Wenn ich ein Bild in der Galerie klicken, wird die App Kraft und in meinem logcat erhalte ich folgendes:java.lang.RuntimeException: Fehler beim Liefern des Ergebnisses ResultInfo {who = null, request = 1, result = -1, data = intent} zur Aktivität

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) 

Mein lolcatactivity.java verfügbar ist hier: http://pastebin.com/AVL8CswT Mein lolcatview.java finden Sie hier: http://pastebin.com/vD7vCBgY

Vielen Dank!

+1

Ist das alles der LogCat Fehler? Ironischerweise stürzt deine App kurz nach dem Kommentar '// TODO: ist es sicher anzunehmen, dass dies immer ein BitmapDrawable sein wird?', Anscheinend lautet die Antwort: "nein". – Sam

+0

Es sagt "... 11 mehr", aber ich kann sie nicht sehen. Hast du eine Idee, wie du es reparieren kannst? – Jack

Antwort

3

getDrawable gibt in Ihrem Fall null zurück. Die URI, die Sie für setImageURI verwenden, ist möglicherweise nicht gültig, daher erhalten Sie null.

Machen Sie einen Null-Check für Zeichen, wenn Zeichen null ist, müssen Sie ablegen.

Edit:

if(drawable == null) 
    return; 
+0

Wie führe ich einen Null-Check für Zeichen aus? Und wenn es null ist, erklären Sie "Sie müssen Kaution". – Jack

+0

Ich habe bearbeitet, fügen Sie vor Zeile 139 – nandeesh

+0

Ok Ich habe es hinzugefügt, es nicht mehr ausflippen yay! Es gibt ein neueres, aber einfacheres Problem. Einige der Bilder gehen über mein VM-Budget, sodass ich einen java.lang.OutofMemoryError erhalte. Wie kann ich mein VM-Budget erhöhen, damit mehr Bilder verwendet werden können? – Jack

1

i Code überprüft haben, so denke ich, Sie Ihre Schaltfläche Aktion ersetzen müssen wie diese

private static final int SELECT_PHOTO = 100 

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

und in Ihrem Start-Aktivität Ergebnis geben

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

Und fügen Sie diese Zeilen hinzu, um den Speicherverlust zu vermeiden, während die Bildansicht in Ihrer Aktivität angezeigt wird.

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

Hoffnung diese willl helfen Ihnen

+0

@nandeesh gab mir eine Lösung bereits. Obwohl ich Ihre versuchen möchte, hoffentlich wird es das Speicherleck patch. – Jack

+0

Wo sollte ich den Bitmap-Konverter hinzufügen? – Jack

+0

Entschuldigung für die späte Wiedergabe sehen Sie die decodeFile (Datei f), die die Bildgröße reduziert – Ramz

Verwandte Themen