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

Android - Как загрузить фотографию с SD-карты на стену Facebook

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

Цель

Создайте несколько сообщений в ленте новостей Facebook, которые будут содержать фотографию с Android-устройства (ее SD-карта) и некоторые комментарии, Результат должен быть таким же, как и при использовании функции "Добавить фото/видео" непосредственно в Facebook. В конце концов, это должно выглядеть так:

Требуемый результат Facebook

Цель

Проблема

Я не могу этого сделать.

Я просмотрел множество подобных записей в Stack Overflow, но ответа пока нет.

То, что я пытался реализовать до сих пор

Подход 1: фотографии с SD-карты 2 Альбом Facebook

Как

Загрузите изображения с моего мобильного телефона (его SD-карты) в альбом, созданный для моего приложения, при первом загрузке изображения. В этом случае при создании объекта params я использую ключ picture и помещаю байты изображения в качестве его значения. Я использую me/photos в вызове request(...) объекта Facebook (или AsyncFacebookRunner). **

Проблема

Не все загруженные изображения отображаются на моей стене. Вместо этого в альбом 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: Интернет-фото 2 лента новостей facebook

Как

Отображать изображения, хранящиеся где-то в Интернете, в сообщениях на стене. В этом случае при создании объекта params я использую ключ link и устанавливаю url для изображения как его значение. Я использую 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

Связанные фотографии

Подход 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

Почти там

Итак, любые идеи, как я мог бы достичь своей цели?

РЕДАКТИРОВАТЬ - НАЧАЛО РАБОТЫ

Кажется, что единственный способ создать новые сообщения, содержащие фотографии на стене пользователя, - это добавить фотографии и связанные с ними комментарии к фотоальбому на стене.

How - фрагмент кода

Остерегайтесь: вызов facebook.request должен быть заменен асинхронным вызовом, поэтому операция не блокирует поток пользовательского интерфейса!!!

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

Ответ 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);            
            }

Ответ 2

Если пользователь еще не опубликовал фотографию на своей стене (нет фотоальбома на стене), вы можете использовать запрос me/photo для публикации фотографии в первую очередь. Это автоматически создаст альбом на стене.

Ответ 3

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

Ответ 4

Добавьте этот класс в свой код

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

}