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