Подтвердить что ты не робот

Картинка для Android на стене Facebook

Я пытаюсь опубликовать фотографию на стене в Facebook. Мне удалось войти в систему и разместить текст на стене. Однако, когда я пытаюсь опубликовать изображение, ничего не происходит.

Я использую Android Facebook SDK.

Вот что я до сих пор:

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

Toast показывает 8733, что означает, что массив байтов не пуст.

NB. Logcat выводит некоторые предупреждения (а не ошибки):

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.

(Показывает несколько раз под друг другом.)

Что я делаю неправильно?


решаемые. Это то, что я сделал, чтобы заставить его работать:

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

И вспомогательный метод:

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());
    }
}
4b9b3361

Ответ 1

во-первых, вы не используете график api для загрузки изображений... u r используя старый rest api... попробуйте использовать график api, его простой...

Используйте следующий код:

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

Согласно сообщению об ошибке, похоже, что он дает ошибки в получении байтов из комплекта намерений...

Ответ 2

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

попробуйте этот код, он будет работать, я использовал тот же код и загружал изображение на Facebook.

Ответ 3

Вот пример рабочего кода. Пропустите путь изображения и сообщение.

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



}

Ответ 4

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;

        }
    }

Ответ 5

Я уверен, что Facebook исправит это в конце концов, но пока эти примеры (размещенные другими пользователями) очень вводят в заблуждение, потому что они фактически не отправляются на стену пользователя (в обычном смысле). Вместо этого они добавляются в фотогалерею пользователя, а затем оказываются на стене, но не так, как работают обычные сообщения... нет названия и нет заголовка, и если вы добавляете еще одну фотографию, это заканчивается бок о бок с первой (а не отдельной записью). Таким образом, когда вы используете команду api me/feed, она просто терпит неудачу с эффектным способом, когда она фактически добавляет сообщение в стену, но это пустая запись из приложения (она даже игнорирует заголовок и подпись).

Надеюсь, что в ближайшее время Facebook это исправит.

Ответ 6

Размещение изображения и текста на стене Facebook из кода, после входа в систему с использованием учетных данных facebook.

note: Это применимо только после входа в ваше приложение с использованием учетных данных facebook

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