Android发布图片到Facebook墙

我想在Facebook上发布一张图片到我的墙上。 我已经管理登录并将文本发布到墙上。 但是,当我尝试发布图片时,没有任何反应。

我正在使用Android Facebook SDK 。

这是我到目前为止:

Bundle params = new Bundle(); params.putString("method", "photos.upload"); Toast.makeText(FacebookPoster.this, "" + getIntent().getExtras().getByteArray("data").length, Toast.LENGTH_SHORT).show(); params.putByteArray("picture", getIntent().getExtras().getByteArray("data")); AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook); mAsyncRunner.request(null, params, "POST", new SampleUploadListener(), null); 

Toast显示8733,这意味着字节数组不为空

NB。 Logcat输出一些警告(不是错误):

 03-02 14:19:29.554: WARN/Bundle(1891): Attempt to cast generated internal exception: 03-02 14:19:29.554: WARN/Bundle(1891): java.lang.ClassCastException: java.lang.String 03-02 14:19:29.554: WARN/Bundle(1891): at android.os.Bundle.getByteArray(Bundle.java:1305) 03-02 14:19:29.554: WARN/Bundle(1891): at com.facebook.android.Util.openUrl(Util.java:155) 03-02 14:19:29.554: WARN/Bundle(1891): at com.facebook.android.Facebook.request(Facebook.java:559) 03-02 14:19:29.554: WARN/Bundle(1891): at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:253) 03-02 14:19:29.584: WARN/Bundle(1891): Key method expected byte[] but value was a java.lang.String. The default value  was returned. 

(在彼此之下多次显示。)

我究竟做错了什么?


解决了。 这就是我做的工作:

 facebook.authorize(this, new String[] { "publish_stream" }, new DialogListener() { @Override public void onFacebookError(FacebookError e) { // TODO Auto-generated method stub } @Override public void onError(DialogError dialogError) { // TODO Auto-generated method stub } @Override public void onComplete(Bundle values) { postToWall(values.getString(Facebook.TOKEN)); } @Override public void onCancel() { // TODO Auto-generated method stub } }); 

和辅助方法:

 private void postToWall(String accessToken) { Bundle params = new Bundle(); params.putString(Facebook.TOKEN, accessToken); // The byte array is the data of a picture. params.putByteArray("picture", getIntent().getExtras().getByteArray("data")); try { facebook.request("me/photos", params, "POST"); } catch (FileNotFoundException fileNotFoundException) { makeToast(fileNotFoundException.getMessage()); } catch (MalformedURLException malformedURLException) { makeToast(malformedURLException.getMessage()); } catch (IOException ioException) { makeToast(ioException.getMessage()); } } 

Solutions Collecting From Web of "Android发布图片到Facebook墙"

第一件事是你没有使用图形api上传图片…你使用旧的api …尝试使用图形api,它简单…

使用以下代码:

 Bundle param = new Bundle(); param.putString("message", "picture caption"); param.putByteArray("picture", ImageBytes); mAsyncRunner.request("me/photos", param, "POST", new SampleUploadListener()); 

根据错误消息,看起来它在从intent的bundle中获取字节时出错…

 btnLogin.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub facebook.authorize(FbdemoActivity.this, new String[]{ "user_photos,publish_checkins,publish_actions,publish_stream"},new DialogListener() { @Override public void onComplete(Bundle values) { } @Override public void onFacebookError(FacebookError error) { } @Override public void onError(DialogError e) { } @Override public void onCancel() { } }); } }); public void postImageonWall() { byte[] data = null; Bitmap bi = BitmapFactory.decodeFile("/sdcard/viewitems.png"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bi.compress(Bitmap.CompressFormat.JPEG, 100, baos); data = baos.toByteArray(); Bundle params = new Bundle(); params.putString(Facebook.TOKEN, facebook.getAccessToken()); params.putString("method", "photos.upload"); params.putByteArray("picture", data); AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook); mAsyncRunner.request(null, params, "POST", new SampleUploadListener(), null); } public class SampleUploadListener extends BaseRequestListener { public void onComplete(final String response, final Object state) { try { // process the response here: (executed in background thread) Log.d("Facebook-Example", "Response: " + response.toString()); JSONObject json = Util.parseJson(response); final String src = json.getString("src"); // then post the processed result back to the UI thread // if we do not do this, an runtime exception will be generated // eg "CalledFromWrongThreadException: Only the original // thread that created a view hierarchy can touch its views." } catch (JSONException e) { Log.w("Facebook-Example", "JSON Error in response"); } catch (FacebookError e) { Log.w("Facebook-Example", "Facebook Error: " + e.getMessage()); } } @Override public void onFacebookError(FacebookError e, Object state) { } } 

尝试这个代码它将工作我使用相同的代码并上传Facebook上的图像。

这是工作代码示例。 传递图像路径和消息。

 public static void postImageonWall(String FilePath,String msg ) { try { Bitmap bi = BitmapFactory.decodeFile(FilePath); AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bi.compress(Bitmap.CompressFormat.PNG, 100, stream); // where bm is bitmap from Sdcard byte[] byteArray = stream.toByteArray(); Bundle param = new Bundle(); param = new Bundle(); param.putString("message", msg); param.putString("filename", "Dessert Dash"); param.putByteArray("image", byteArray); param.putString("caption", "Dessert Dash in Android Market Now"); mAsyncRunner.request("me/photos", param, "POST", fbrq, null); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } 
 private String postwall(String uid) { String response = ""; try { String DIRECTORY_PATH = "/sdcard/159.jpg"; Bundle params = new Bundle(); Bitmap bitmap = BitmapFactory.decodeFile(DIRECTORY_PATH); byte[] data = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); data = baos.toByteArray(); params.putString("app_id", uid); params.putString("message", "picture caption"); params.putByteArray("picture", data); mFacebook.authorize(this, PERMISSIONS, new LoginDialogListener()); mAsyncRunner.request("me/photos", params, "POST", new WallPostRequestListener()); mAsyncRunner.request(response, new WallPostRequestListener()); Log.e("post result", response); } catch (Exception e) { e.printStackTrace(); } return response; } public class WallPostRequestListener extends BaseRequestListener { public void onComplete(final String response) { Log.d("Facebook-Example", "Got response: " + response); String message = ""; try { JSONObject json = Util.parseJson(response); message = json.getString("message"); } catch (JSONException e) { Log.w("Facebook-Example", "JSON Error in response"); } catch (FacebookError e) { Log.w("Facebook-Example", "Facebook Error: " + e.getMessage()); } final String text = "Your Wall Post: " + message; } } 

我相信Facebook最终会解决这个问题,但目前这些例子(由其他用户发布)非常具有误导性,因为它们实际上不会发布到用户的墙上(通常意义上)。 相反,他们被添加到用户的照片库,然后碰巧最终在墙上,但不是正常的post工作的方式…没有标题和没有标题,如果你添加另一张照片,它最终与第一个并排(而不是作为单独的条目)。 因此,当你使用api命令me / feed时,它只是以一种壮观的方式失败,它实际上将一个post添加到墙上,但它是一个来自应用程序的空post(它甚至忽略了标题和标题)。

希望Facebook能在短期内解决这个问题。

一旦您使用Facebook凭据登录,就可以从代码中将图像和文本发布到Facebook墙上。

注意:仅在使用facebook凭据登录您的应用程序后才适用

 sharePhotoToFacebook(); //function called from any UI event private void sharePhotoToFacebook(){ Bitmap bitmap=null; String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Download/"; try { File file = new File(path, "image9.jpg"); bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); } catch (Exception e){ Log.e("Error" , " Error in loading file"); } SharePhoto photo = new SharePhoto.Builder() .setBitmap(bitmap) .setCaption("A post from Android code") .build(); SharePhotoContent content = new SharePhotoContent.Builder() .addPhoto(photo) .build(); ShareApi.share(content, null); Toast.makeText(LoginSuccessActivity.this, "Image posted successfully", Toast.LENGTH_LONG).show(); }