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

时间:2011-12-28 23:31:10

标签: android facebook

我使用Facebook Android SDK。

目标

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

想要Facebook结果

Goal

问题

我不能这样做。

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

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

方法1:SD卡照片2 Facebook专辑

如何

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

问题

并非所有上传的图片都显示在我的墙上。相反,有一些像 x照片被添加到相册xxx

代码片段是(对于一张图片)

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:互联网照片2 facebook新闻提要

如何

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

问题

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

代码片段是(对于一张图片)

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键并将照片字节设置为其值(如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

那么,任何想法如何实现我的目标?

编辑 - 找到了替代方法

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

How - Code snippet

注意: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);
}

4 个答案:

答案 0 :(得分: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 :(得分:0)

如果用户之前没有在他/她的墙上发布照片(没有墙相册),您可以先使用me/photo请求发布照片。这将自动创建一个壁纸专辑。

答案 2 :(得分: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);            
        }

答案 3 :(得分: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 *******************");
    }

}