Android - 如何将照片从SD卡上传到Facebook墙

标签 android facebook

我使用 Facebook Android SDK。

目标

在 Facebook 登录用户的新闻提要中创建多个帖子,其中将包含来自 Android 设备(其 SD card)的照片和一些评论。结果应该与直接在 Facebook 中使用添加照片/视频功能时相同。最后,它应该是这样的:

通缉 Facebook 结果

Goal

问题

我做不到。

我浏览了 Stack Overflow 上的许多类似帖子,但到目前为止还没有答案。

到目前为止我尝试实现的内容

方法一:SD卡照片2 Facebook相册

如何

从我的手机(它的 SD 卡)上传图片到我第一次从它上传图片时为我的应用程序创建的相册。在这种情况下,在构造 params 对象时,我使用 picture 键并将图片的字节作为其值。我在 Facebook(或 AsyncFacebookRunner)对象的 request(...) 调用中使用了 me/photos。 **

问题

并非所有上传的图片都显示在我的墙上。取而代之的是,x 张照片已添加到相册 xxx

代码 fragment 是这样的(一张图片)

Bundle params = new Bundle();
params.putString("message", "Uploaded on " + now());
params.putByteArray("picture", bytes); //bytes contains photo bytes, no problem here
asyncRunner.request("me/photos", params, "POST", new PostPhotoRequestListener(), null);

Facebook 结果

Photos to album

方法二:网络照片 2 facebook news feed

如何

在我的墙上的帖子中显示存储在 Internet 某处的图片。在这种情况下,在构造 params 对象时,我使用 link 键并将 url 设置为 picture 作为其值。我在 request(...) 调用中使用了 me/feed

问题

这会产生一些奇怪的输出,但这不是我想要的。

代码 fragment 是这样的(一张图片)

Bundle params = new Bundle();
params.putString("message", "Uploaded on " + now());
params.putString("link", "http://i1114.photobucket.com/albums/k538/tom_rada/bota2.jpg");
asyncRunner.request("me/feed", params, "POST", new PostPhotoRequestListener(), null);

Facebook 结果

Linked photos

方法 3:方法 1 和 2 的混合

如何

我尝试使用 picture 键并将 photo bytes 设置为其值(如 1. 中所示),并使用 me/feed< 调用请求(如 2.),

问题

消息按我希望的方式生成,但没有包含照片

代码 fragment 是这样的(一张图片)

Bundle params = new Bundle();
params.putString("message", "Uploaded on " + now());
params.putByteArray("picture", bytes); //bytes contains photo bytes, no problem here
asyncRunner.request("me/feed", params, "POST", new PostPhotoRequestListener(), null);

Facebook 结果

Almost there

那么,有什么办法可以实现我的目标吗?

编辑 - 找到解决方法

似乎在用户墙上创建包含照片的新帖子的唯一方法是将照片和相关评论添加到用户的墙上照片相册。

如何 - 代码 fragment

注意:facebook.request 调用应该替换为异步调用,这样操作就不会阻塞 UI 线程!!!

String wallAlbumID = null;
String response = facebook.request("me/albums");
JSONObject json = Util.parseJson(response);
JSONArray albums = json.getJSONArray("data");
for (int i =0; i < albums.length(); i++) {
    JSONObject album = albums.getJSONObject(i);
    if (album.getString("type").equalsIgnoreCase("wall")) {
        wallAlbumID = album.getString("id");
        Log.d("JSON", wallAlbumID);
        break;
    }
}

...然后

if (wallAlbumID != null) {
    Bundle params = new Bundle();
    params.putString("message", "Uploaded on " + now());
    params.putByteArray("source", bytes);
    asyncRunner.request(wallAlbumID+"/photos", params, "POST", new PostPhotoRequestListener(), null);
}

最佳答案

Facebook facebook = new Facebook("your appid");

  private void uploadImage() 
        {
            Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
            final byte[] data = stream.toByteArray();

            facebook.authorize(FacebookActivity.this, new String[]{ "user_photos,publish_checkins,publish_actions,publish_stream"},new DialogListener() 
            {                     
                @Override                     
                public void onComplete(Bundle values) 
                {
                   //uploadImageOnlyToWall(data, "Uploading Image only to wall","Test Post from Android while uploading photo with message");   

                    uploadImageToWallAndAlbums(imageUrl, "Image via link");

                }   

                @Override                     
                public void onFacebookError(FacebookError error) 
                {
                    Toast.makeText(FacebookActivity.this, "FaceBook Error", Toast.LENGTH_LONG).show();
                }                      
                @Override                     
                public void onError(DialogError e) 
                {
                    Toast.makeText(FacebookActivity.this, "Error", Toast.LENGTH_LONG).show();
                }                      
                @Override                     
                public void onCancel() 
                {
                    Toast.makeText(FacebookActivity.this, "Canceled", Toast.LENGTH_LONG).show();
                }           
            }); 

        }


       private void uploadImageOnlyToAlbum(byte[] byteArray,String caption) 
           {
               Bundle params = new Bundle(); 
               params.putByteArray("picture", byteArray);  
               params.putString("caption",caption);  
               AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook); 
               mAsyncRunner.request("me/photos", params, "POST", new SampleUploadListener(), null);             
            }

           private void uploadImageToWallAndAlbums(byte[] byteArray,String caption) 
           {
               Bundle params = new Bundle(); 
               params.putString("method", "photos.upload"); 
               params.putByteArray("picture", byteArray);  
               params.putString("caption", caption);  
               AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook); 
               mAsyncRunner.request(null, params, "POST", new SampleUploadListener(), null);            
            }

关于Android - 如何将照片从SD卡上传到Facebook墙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8662460/

相关文章:

java - 无法将 java.lang.String 类型的值转换为 double

android facebook api 发布

android - Eclipse 是否支持构建 PreferenceScreen?

Facebook graph api - 如何获取标记照片的数量

Facebook 评论插件 : How to sort the comments, 最新第一?

Android - AdMob 将广告设置为“消失”?

android - 将字符串与 SHA-256 语句进行比较

iPhone Facebook 应用 : Where does the "permissions array" code go?

facebook - 如何在使用应用程序的用户之间获得相互的 facebook 喜欢

facebook - URL 请求了 HTTP 重定向,但无法遵循。 - Facebook/Nginx 问题