使用Facebook Android SDK在Android上上传照片到Facebook

11

我是Android新手。我正在寻找通过授权将照片加载到Facebook,获取访问令牌的方法。如何做到这一点?请给我一个Java示例代码。

我是Android新手,想知道如何通过授权加载照片到Facebook并获取访问令牌。请提供Java示例代码。

8
Sanjana,你应该接受一个答案。这有助于你和其他在 Stack Overflow 上提供帮助的人。谢谢。 - Anthony Graglia
5个回答

15

这里发布了一种简单的上传照片的方法:

android facebook publish photo

代码:

byte[] data = null;

Bitmap bi = BitmapFactory.decodeFile(photoToPost);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bi.compress(Bitmap.CompressFormat.JPEG, 100, baos);
data = baos.toByteArray();

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

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

我如何为上传的照片添加描述? - Maxim
你解决了吗?关于描述的那部分? - ekawas
对不起,我还没有。我现在忙于其他项目,你有进展吗? - Anthony Graglia
这需要经过应用程序注册的过程吗? - n00b programmer
6
添加描述请使用以下代码:params.putString("caption", "在此添加描述"); - Bhavesh Hirpara
显示剩余2条评论

8
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) {
        // TODO Auto-generated method stub

    }
}

这是完整的代码,请尝试它,它一定会对您有用,对我也有效。


1
什么是BaseRequestListener? - Shreyash Mahajan
你的示例对我有用。但是我想在那个相片发布中附带一个简单的消息。这有可能吗?有什么想法吗?请在此处给出答案:http://stackoverflow.com/questions/8585043/android-how-to-post-the-message-with-the-image-post-on-facebook - Shreyash Mahajan
1
这段代码可以工作,但有以下注意事项:1. 我将facebook.authorize()调用放在了onClick()方法中。我将另外两个方法添加到了我的现有Activity中。2. 如果您在应用程序运行期间重复上传超过一次,则会导致内存不足错误。 - Bill Mote
1
安卓无法识别BaseRequestListener。这个类在哪里?我需要完整的代码。我不知道Facebook对象从哪里来?例如:facebook.authorize() - Muhammad Aamir Ali
@MuhammadAamirAli 同样的问题!无法解析符号“BaseRequestListener” - Srichakradhar
显示剩余2条评论

4

2
看了一下FB API,我没有看到上传图片的方法。我只看到可以将图片URL作为参数传递,但没有看到可以传递图片数据本身的方法。或者是我有什么遗漏吗? - Mathias Conradt
如何在 Facebook 上分享多张图片?请帮忙。 - jyomin

3

我很高兴地向facebook的广场上传了照片。我使用了以下代码。

在您的主活动中,请执行以下操作:

btn1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            authenticatedFacebook.authorize(Facebooktest2Activity.this, new String[]{ "user_photos,publish_checkins,publish_actions,publish_stream"},new DialogListener() {
                    @Override
                    public void onComplete(Bundle values) {
                        postImage();
                        Toast.makeText(getApplicationContext(), "Image Posted on Facebook.", Toast.LENGTH_SHORT).show();


                    }

                    @Override
                    public void onFacebookError(FacebookError error) {
                    }

                    @Override
                    public void onError(DialogError e) {
                    }

                    @Override
                    public void onCancel() {
                    }

    });


        }
});






}

public void postImage(){
     byte[] data = null;               

        Bitmap bi = BitmapFactory.decodeFile("/sdcard/img.jpg");
        //Bitmap bi = BitmapFactory.decodeResource(getResources(), R.drawable.icon);             
        ByteArrayOutputStream baos = new ByteArrayOutputStream();              
        bi.compress(Bitmap.CompressFormat.JPEG, 100, baos);              
        data = baos.toByteArray();                
        Bundle params = new Bundle();              
        params.putString(Facebook.TOKEN, authenticatedFacebook.getAccessToken());              
        params.putString("method", "photos.upload");              
        params.putByteArray("picture", data);               
        AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(authenticatedFacebook);              
        mAsyncRunner.request(null, params, "POST", new SampleUploadListener(), null);   

}


public class SampleUploadListener extends BaseKeyListener implements RequestListener {

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

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

    }

    public Bitmap getInputType(Bitmap img) {
        // TODO Auto-generated method stub
        return img;
    }

    @Override
    public int getInputType() {
        // TODO Auto-generated method stub
        return 0;
    }

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

    }

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

    }

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

    }
}

当然,这段代码会对你有所帮助。

我使用了这段代码,但是出现了异常 java.lang.OutOfMemoryError,异常信息显示在以下代码行:java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:103),java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:234),android.graphics.Bitmap.nativeCompress(Native Method)。具体是在 bi.compress(Bitmap.CompressFormat.JPEG, 100, baos); 这一行发生的。 - Manikandan
authenticatedFacebook 是什么?它给我报错了,请帮忙。 - jyomin
这真的帮了我很多。非常感谢。 - Mayur
如果我们需要分享多张图片到Facebook怎么办?请帮忙。 - jyomin

3
如果您想发布带描述的照片,可以按照以下步骤操作:
public void publishPhoto(byte[] imgData, string message) {

AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner (facebook);

Bundle parameters = new Bundle ();
parameters.putString (Facebook.TOKEN, facebook.getAccessToken());
parameters.putString ("message", message);
parameters.putByteArray ("source", imgData);

mAsyncRunner.Request ("me/photos", parameters, "POST", new RequestListener (), null);
}

1
+1 就是这样!谢谢。在筛选了那么多使用传统 API 的人之后,这个终于展示了 Graph API 的解决方案。 - Lee Oades

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接