it-swarm.com.de

Android posten Bild an Facebook-Wand

Ich versuche, ein Bild bei Facebook an meine Wand zu senden. Ich habe es geschafft, mich anzumelden und Text an die Wand zu senden. Wenn ich jedoch versuche, das Bild zu posten, passiert nichts.

Ich verwende das Android Facebook SDK .

Folgendes habe ich bisher:

    Bundle params = new Bundle();
    params.putString("method", "photos.upload");

    Toast.makeText(FacebookPoster.this, "" + getIntent().getExtras().getByteArray("data").length, Toast.LENGTH_SHORT).show();

    params.putByteArray("picture", getIntent().getExtras().getByteArray("data"));

    AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook);
    mAsyncRunner.request(null, params, "POST", new SampleUploadListener(), null);

Der Toast zeigt 8733, was bedeutet, dass das Byte-Array nicht leer ist

NB. Logcat gibt einige Warnungen aus (keine Fehler):

03-02 14:19:29.554: WARN/Bundle(1891): Attempt to cast generated internal exception:
03-02 14:19:29.554: WARN/Bundle(1891): Java.lang.ClassCastException: Java.lang.String
03-02 14:19:29.554: WARN/Bundle(1891):     at Android.os.Bundle.getByteArray(Bundle.Java:1305)
03-02 14:19:29.554: WARN/Bundle(1891):     at com.facebook.Android.Util.openUrl(Util.Java:155)
03-02 14:19:29.554: WARN/Bundle(1891):     at com.facebook.Android.Facebook.request(Facebook.Java:559)
03-02 14:19:29.554: WARN/Bundle(1891):     at com.facebook.Android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.Java:253)
03-02 14:19:29.584: WARN/Bundle(1891): Key method expected byte[] but value was a Java.lang.String.  The default value <null> was returned.

(Zeigt mehrere Male untereinander.)

Was mache ich falsch?


Gelöst. Das habe ich getan, damit es funktioniert:

facebook.authorize(this, new String[] { "publish_stream" },
        new DialogListener() {

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

    @Override
    public void onError(DialogError dialogError) {
    // TODO Auto-generated method stub
    }

    @Override
    public void onComplete(Bundle values) {
        postToWall(values.getString(Facebook.TOKEN));                                              
    }

    @Override
    public void onCancel() {
    // TODO Auto-generated method stub
    }
});

Und die Hilfsmethode:

private void postToWall(String accessToken) {       
    Bundle params = new Bundle();

    params.putString(Facebook.TOKEN, accessToken);

    // The byte array is the data of a picture.
    params.putByteArray("picture", getIntent().getExtras().getByteArray("data"));

    try {
        facebook.request("me/photos", params, "POST");

    } catch (FileNotFoundException fileNotFoundException) {
        makeToast(fileNotFoundException.getMessage());
    } catch (MalformedURLException malformedURLException) {
        makeToast(malformedURLException.getMessage());
    } catch (IOException ioException) {
        makeToast(ioException.getMessage());
    }
}
20
whirlwin

das erste ist, dass Sie nicht Graph API verwenden, um die Bilder hochzuladen ... Sie verwenden die alte Rest API ... Versuchen Sie Graph API zu verwenden, es ist einfach ... 

Verwenden Sie folgenden Code:

Bundle param = new Bundle();
param.putString("message", "picture caption");
param.putByteArray("picture", ImageBytes);
mAsyncRunner.request("me/photos", param, "POST", new SampleUploadListener());

Laut Fehlermeldung sieht es so aus, als würde es Fehler beim Abrufen von Bytes aus dem Intent-Bündel geben ...

23
Farhan

Hier ist das Arbeitscode-Beispiel. Bildpfad und Nachricht übergeben.

public static void postImageonWall(String FilePath,String msg ) {

    try {

        Bitmap bi = BitmapFactory.decodeFile(FilePath);
        AsyncFacebookRunner mAsyncRunner = new   AsyncFacebookRunner(facebook);
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bi.compress(Bitmap.CompressFormat.PNG, 100, stream);  // where bm is bitmap from Sdcard
        byte[] byteArray = stream.toByteArray();
        Bundle param = new Bundle();
        param = new Bundle();
        param.putString("message", msg);
        param.putString("filename", "Dessert Dash");
        param.putByteArray("image", byteArray);
        param.putString("caption", "Dessert Dash in Android Market Now");

        mAsyncRunner.request("me/photos", param, "POST", fbrq, null);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }



}
6
Jawad Amjad
btnLogin.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                facebook.authorize(FbdemoActivity.this, new String[]{ "user_photos,publish_checkins,publish_actions,publish_stream"},new DialogListener() {
                    @Override
                    public void onComplete(Bundle values) {
                    }

                    @Override
                    public void onFacebookError(FacebookError error) {
                    }

                    @Override
                    public void onError(DialogError e) {
                    }

                    @Override
                    public void onCancel() {
                    }
                });

            }
        });

public void postImageonWall() {

           byte[] data = null;

             Bitmap bi = BitmapFactory.decodeFile("/sdcard/viewitems.png");
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
             bi.compress(Bitmap.CompressFormat.JPEG, 100, baos);
             data = baos.toByteArray();


             Bundle params = new Bundle();
             params.putString(Facebook.TOKEN, facebook.getAccessToken());
             params.putString("method", "photos.upload");
             params.putByteArray("picture", data);

             AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook);
             mAsyncRunner.request(null, params, "POST", new SampleUploadListener(), null);

    }

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) {    
    }
}

probieren Sie diesen Code aus, es wird funktionieren. Ich hatte den gleichen Code verwendet und lädt das Bild auf Facebook hoch.

6
Nilesh Gawade
private String postwall(String uid)
    {
        String response = "";
        try
        {

            String DIRECTORY_PATH = "/sdcard/159.jpg";
            Bundle params = new Bundle();
            Bitmap bitmap = BitmapFactory.decodeFile(DIRECTORY_PATH);
            byte[] data = null;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            data = baos.toByteArray();
            params.putString("app_id", uid);
            params.putString("message", "picture caption");
            params.putByteArray("picture", data);

            mFacebook.authorize(this, PERMISSIONS, new LoginDialogListener());
            mAsyncRunner.request("me/photos", params, "POST", new WallPostRequestListener());
            mAsyncRunner.request(response, new WallPostRequestListener());
            Log.e("post result", response);

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return response;
    }

    public class WallPostRequestListener extends BaseRequestListener
    {

        public void onComplete(final String response)
        {
            Log.d("Facebook-Example", "Got response: " + response);
            String message = "<empty>";
            try
            {
                JSONObject json = Util.parseJson(response);
                message = json.getString("message");
            }
            catch (JSONException e)
            {
                Log.w("Facebook-Example", "JSON Error in response");
            }
            catch (FacebookError e)
            {
                Log.w("Facebook-Example", "Facebook Error: " + e.getMessage());
            }
            final String text = "Your Wall Post: " + message;

        }
    }
4
Sock

Ich bin mir sicher, dass Facebook das irgendwann korrigieren wird, aber vorerst sind diese Beispiele (von anderen Nutzern gepostet) sehr irreführend, da sie NICHT an die Benutzerwand senden (im regulären Sinne). Sie werden stattdessen der Fotogalerie des Benutzers hinzugefügt und landen dann zufällig an der Wand, jedoch nicht auf die gleiche Weise, wie normale Posts funktionieren. Es gibt keinen Titel und keine Bildunterschrift Seite an Seite mit der ersten (anstatt als separater Eintrag). Wenn Sie also den api-Befehl me/feed verwenden, schlägt dies nur auf eine spektakuläre Weise fehl, bei der es tatsächlich einen Beitrag zur Pinnwand hinzufügt, aber es ist ein leerer Beitrag aus der Anwendung (es ignoriert sogar Titel und Bildunterschrift). 

Hoffentlich wird Facebook dies in naher Zukunft beheben.

2
Genia S.

Das Bild und den Text auf Facebook-Wand aus dem Code veröffentlichen, Nachdem Sie sich mit den Facebook-Anmeldedaten angemeldet haben.

hinweis: Dies gilt nur, wenn Sie sich mit Facebook-Zugangsdaten bei Ihrer App anmelden

sharePhotoToFacebook();                  //function called from any UI event

private void sharePhotoToFacebook(){
        Bitmap bitmap=null;
        String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Download/";
        try {
            File file = new File(path, "image9.jpg");
            bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
        }
        catch (Exception e){
            Log.e("Error" , " Error in loading file");
        }

        SharePhoto photo = new SharePhoto.Builder()
                .setBitmap(bitmap)
                .setCaption("A post from Android code")
                .build();

        SharePhotoContent content = new SharePhotoContent.Builder()
                .addPhoto(photo)
                .build();

        ShareApi.share(content, null);
        Toast.makeText(LoginSuccessActivity.this, "Image posted successfully", Toast.LENGTH_LONG).show();
    }
0
Sackurise