Null Pointer Exception beim Posten eines Bildes auf Facebook-Wand (Android)

Meine App soll Benutzern erlauben, ein Bild zu machen und es dann auf ihre Facebook-Wand hochladen. Der folgende Code ist vielen anderen Beispielen für Arbeitscode sehr ähnlich, der in anderen SO-Fragen zu genau diesem Problem gegeben wird, gibt mir aber trotzdem die Nullzeiger-Ausnahme:

    private void postOnWall()
    {
        final String response = "";
    try
    {
        Bundle params = new Bundle();
        params.putString("message", getMessage());
        params.putByteArray("picture", byteArray);
        mAsyncRunner.request(me/feed, params, "POST", new SampleUploadListener(),
        null);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }       
}

Ich möchte einfach, dass das Hochladen des Bildes funktioniert, bevor ich mit dem Hinzufügen der Nachricht fortfahren kann. Irgendwelche Ideen?

BEARBEITEN:  Hier ist die SampleUploadListener (), die mit der AsyncRunner (...) Zeile gehört:

public class SampleUploadListener extends BaseRequestListener {
    public void onComplete(final String response, final Object state) {
        try {
           //process the response here: (executed in background thread)
            Log.d("Facebook-Example", "Response: " + response.toString());
            JSONObject json = Util.parseJson(response);
            final String src = json.getString("src");

           //then post the processed result back to the UI thread
           //if we do not do this, an runtime exception will be generated
           //e.g. "CalledFromWrongThreadException: Only the original
           //thread that created a view hierarchy can touch its views."

        } catch (JSONException e) {
            Log.w("Facebook-Example", "JSON Error in response");
        } catch (FacebookError e) {
            Log.w("Facebook-Example", "Facebook Error: " + e.getMessage());
        }
    }

    @Override
    public void onFacebookError(FacebookError e, Object state) {
       //TODO Auto-generated method stub

    }
}

LogCat:

06-22 13:23:45.136: W/System.err(20667): java.lang.NullPointerException
06-22 13:23:45.136: W/System.err(20667):    at     com.uncc.cci.TrashPickup.TrashPickupActivity.postwall(TrashPickupActivity.java:475)
06-22 13:23:45.136: W/System.err(20667):    at com.uncc.cci.TrashPickup.TrashPickupActivity$5$1.onClick(TrashPickupActivity.java:230)
06-22 13:23:45.140: W/System.err(20667):    at android.view.View.performClick(View.java:3511)
06-22 13:23:45.140: W/System.err(20667):    at android.view.View$PerformClick.run(View.java:14105)
06-22 13:23:45.140: W/System.err(20667):    at android.os.Handler.handleCallback(Handler.java:605)
06-22 13:23:45.140: W/System.err(20667):    at android.os.Handler.dispatchMessage(Handler.java:92)
06-22 13:23:45.140: W/System.err(20667):    at android.os.Looper.loop(Looper.java:137)
06-22 13:23:45.140: W/System.err(20667):    at android.app.ActivityThread.main(ActivityThread.java:4424)
06-22 13:23:45.144: W/System.err(20667):    at java.lang.reflect.Method.invokeNative(Native Method)
06-22 13:23:45.144: W/System.err(20667):    at java.lang.reflect.Method.invoke(Method.java:511)
06-22 13:23:45.144: W/System.err(20667):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-22 13:23:45.144: W/System.err(20667):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-22 13:23:45.148: W/System.err(20667):    at dalvik.system.NativeStart.main(Native Method)
0
hinzugefügt bearbeitet
Ansichten: 1
Hast du ein Bild geladen? NullPointerException wird normalerweise ausgelöst, wenn ein -Objekt aufgerufen wird, während es null ist, wenn es nicht null sein sollte.
hinzugefügt der Autor Jason L, Quelle
Sie können ein ByteArray zu mir/Fotos hochladen, aber Sie können ein Bytearray nicht als Post an eine Wand hochladen. Um ein Bild an eine Wand zu posten, müssen Sie eine gültige URL angeben, wo dieses Bild bereits im Internet gespeichert ist.
hinzugefügt der Autor Genia S., Quelle
@Yawus: 'ByteArray' ist ein Byte-Array aus einer Bitmap, die ich bereits behandelt habe. Ich überprüfte, ob es null war und es nicht war.
hinzugefügt der Autor David B, Quelle
@ MichałK: Die Zeile mAsyncRunner.request (...) gibt die Nullzeiger-Ausnahme an
hinzugefügt der Autor David B, Quelle
Wie in der Antwort unten vorgeschlagen, habe ich die erste Null in "me/fotos" geändert, bekomme aber immer noch den gleichen Fehler. Der mAsyncRunner ist vom Typ AsyncFacebookRunner.
hinzugefügt der Autor David B, Quelle
kannst du deinen LogCat posten?
hinzugefügt der Autor gsb, Quelle
Welche Zeile (konsultiere LogCat oder poste es)?
hinzugefügt der Autor Michał K, Quelle
Nun, params , "POST" und new SampleUploadListener() sind sicherlich nicht null. Es muss einer dieser beiden null s sein, der Ihnen NPE gibt. Überprüfe einfach, was dorthin gehen soll (ich weiß nicht, was für ein Objekt dein mAsyncRunner ist) und poste es anstelle von null .
hinzugefügt der Autor Michał K, Quelle

2 Antworten

Wenn Sie den Fehler, den Sie hier haben, korrigiert haben, werden Sie leider feststellen, dass es zu diesem Zeitpunkt nicht möglich ist, ein Bild an Ihre Wand zu stellen, indem Sie die tatsächlichen Bildbytes direkt auf Facebook hochladen. Sie können ein Foto in ihre Fotogalerie hochladen, aber nicht an ihre Wand. Um ein Foto an die Wand zu stellen, muss es bereits online sein und Sie müssen einen Link zu dem Ort angeben, an dem es zusammen mit den anderen Daten gespeichert wird. Wenn ich mich irre, dann ist das eine sehr neue Entwicklung, da ich vor ein paar Monaten auf all das gestoßen bin und sogar einen Bug bei Facebook eingereicht habe, den sie zurückgewiesen haben, dass "es kein Fehler ist, so haben wir es geplant".

If you're ok with putting the photo in their gallery (if it's the only photo IN the gallery it will look almost exactly like a regular wall post) this is the way to do it: Android post picture to Facebook wall

0
hinzugefügt
Ich war zu diesem Schluss gekommen, nachdem ich durch ihre Dokumentation aufmerksamer gelesen hatte, hoffte aber, dass sie in der Zwischenzeit etwas passenderes veröffentlicht hatten. Leider ist das Hochladen eines Fotos in die Galerie kein guter Plan für die App, daher werde ich eine andere Lösung finden. Danke für deine Antwort, die meine Ängste bestätigt!
hinzugefügt der Autor David B, Quelle

Sollte sein:

private void postOnWall() {
    Bundle params = new Bundle();            
    params.putString("message", "New picture");
    params.putByteArray("source", byteArray);
    mAsyncRunner.request("me/photos", params, "POST", new SampleUploadListener(), null);
}

You sent the path as null and that's probably why you got the null pointer exception.
Also according to the documentation the image parameter name is source.


Bearbeiten

Versuchen Sie dies, um zu überprüfen, ob mAsyncRunner null ist:

private void postOnWall() {
    Bundle params = new Bundle();            
    params.putString("message", "New picture");
    params.putByteArray("source", byteArray);
    Log.d("Facebook-Example", mAsyncRunner == null ? "mAsyncRunner is null" : "mAsyncRunner not null");
    mAsyncRunner.request("me/photos", params, "POST", new SampleUploadListener(), null);
}

Da der Fehler in dieser Zeile enthalten ist, scheint es das einzig mögliche zu sein.

0
hinzugefügt
Ich habe meinen Code geändert, um Ihrem Rat zu entsprechen, aber leider bekomme ich immer noch die gleiche Nullzeiger-Ausnahme in derselben Zeile. Gibt es etwas, das ich in meinem SampleUploadListener() einschließen sollte, das das verursachen kann?
hinzugefügt der Autor David B, Quelle
Ich habe meine Frage aktualisiert, um die Änderungen, uploadListener und logcat wiederzugeben
hinzugefügt der Autor David B, Quelle
Ja, es ist vom Typ AsyncFacebookRunner (von com_facebook_android). Ich habe gerade die Dokumentation überprüft und folgendes gefunden: "Stellen Sie eine Anfrage an die Facebook Graph API mit der angegebenen HTTP-Methode und String-Parametern. Beachten Sie, dass binäre Datenparameter (zB Bilder) von dieser Hilfsfunktion noch nicht unterstützt werden. " Ich habe viele andere Posts hier auf SO gesehen, die dieselbe Methode (mit dem HTTP "POST" -Argument) benutzt haben, die Erfolg beim Posten eines Byte-Array-Bildes haben, also ist das verwirrend für mich.
hinzugefügt der Autor David B, Quelle
Danke für Ihre Hilfe!
hinzugefügt der Autor David B, Quelle
Können Sie Ihren geänderten Code und den Code für SampleUploadListener posten?
hinzugefügt der Autor Nitzan Tomer, Quelle
Sind Sie sicher, dass der mAsyncRunner erstellt wurde?
hinzugefügt der Autor Nitzan Tomer, Quelle
Das bezieht sich auf die Methode request des regulären Facebook -Objekts, nicht auf AsyncFacebookRunner . Ich habe meine Antwort bearbeitet.
hinzugefügt der Autor Nitzan Tomer, Quelle