安卓 - 如何从SD卡上传照片到Facebook动态墙

12

我使用Facebook Android SDK。

目标

在Facebook已登录的用户的新闻动态中创建包含Android设备上的照片(其SD卡)和一些评论的多个帖子。最终结果应该与直接在Facebook上添加照片/视频功能时相同。最终效果应该像这样:

期望的Facebook结果

Goal

问题

我无法做到。

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

我迄今尝试实现的内容

方法一:SD卡照片上传至Facebook相册

如何操作

从我的移动设备(其SD卡)上传图片到为我的应用程序创建的相册中。在构造params对象时,我使用“picture”键并将图片的字节作为其值。在Facebook(或AsyncFacebookRunner)对象的“request(...)”调用中使用“me/photos”。

问题

并非所有上传的图像都会显示在我的墙上。而是会显示类似于“xxx相册中添加了x张照片”的信息。

以下是代码片段(针对一张图片):

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的结果

照片添加到相册

方法2:将互联网照片添加到Facebook新闻动态

如何实现

在我的墙上发布帖子时,显示存储在互联网上的图片。在这种情况下,在构建params对象时,我使用link键并将其值设置为图片的URL。在 request(...)调用中使用me/feed

问题所在

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

代码��如下(针对一张图片)

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 结果

相关照片

方法三:结合方法一和二的方式

如何实现

我尝试使用picture关键字,并将照片字节设置为其值(与方法1相同),然后以me/feed请求的方式进行调用(与方法2相同)。

问题

消息的生成与我的预期一致,但未包括任何照片。

以下是代码片段(用于一个图片)

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

那么,有什么想法可以帮我实现目标吗?

编辑 - 发现解决方法

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

如何 - 代码片段

注意:应该使用异步调用替换 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);
}

什么是PostPhotoRequestListener?谢谢。 - Nam Vu
1
facebook.request("me/albums");产生错误,即com.facebook.android.FacebookError:必须使用活动访问令牌来查询有关当前用户的信息。我该如何解决这个问题? - varun bhardwaj
@varunbhardwaj:你可以考虑为你的问题开一个新的帖子。即使它与这个帖子相似,这样做会给你更好的找到解决方案的机会。 - Siddharth Lele
请问您能否给我一个链接,让我可以开发同样的应用程序。我想从我的应用程序中通过Facebook上传照片。我不知道该如何做,请帮帮我。谢谢! - Rahul Baradia
解决方法有一个小缺陷——它假定用户在过去的某个时候已经向她的墙发布了一些照片。如果没有任何墙上的照片,它将会失败。 - kellogs
4个回答

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

1
我非常欣赏你提问的方式,并且解释了哪里出错了 :) - KK_07k11A0585
1
SampleUploadListener() 是什么? - user1025050

0
如果用户以前没有在自己的主页上发布过照片(没有主页相册),您可以使用me/photo请求先发布一张照片。这将自动创建一个主页相册。

这并没有回答问题。 - CocoNess

0
将这个类添加到你的代码中。
public class SampleUploadListener implements RequestListener{

    @Override
    public void onMalformedURLException(MalformedURLException e, Object state) {
        Log.d(TAG, "******************* FACEBOOK::onMalformedURLException *******************");
    }

    @Override
    public void onIOException(IOException e, Object state) {
        Log.d(TAG, "******************* FACEBOOK::onIOException *******************");
    }

    @Override
    public void onFileNotFoundException(FileNotFoundException e, Object state) {
        Log.d(TAG, "******************* FACEBOOK::onFileNotFoundException *******************");
    }

    @Override
    public void onFacebookError(FacebookError e, Object state) {
        Log.d(TAG, "******************* FACEBOOK::onFacebookError *******************");
    }

    @Override
    public void onComplete(String response, Object state) {
        Log.d(TAG, "******************* FACEBOOK::onComplete *******************");
    }

}

0
      Facebook facebook = new Facebook("your App_id");

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

当我调试我的项目时,它没有读取onComplete,我无法发布。我想要通过SD卡发布图像和文本。你能帮忙吗? - Akanksha Rathore

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