Imagen de la publicación de Android en la pared de Facebook

Estoy tratando de publicar una imagen en mi muro en Facebook. He logrado iniciar sesión y publicar texto en la pared. Sin embargo, cuando bash publicar la imagen, no pasa nada.

Estoy usando el Android SDK de Facebook .

Esto es lo que tengo hasta ahora:

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

El Toast muestra 8733, lo que significa que el conjunto de bytes no está vacío

NÓTESE BIEN. Logcat produjo algunas advertencias (no errores):

 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. 

(Se muestra varias veces debajo de la otra)

¿Qué estoy haciendo mal?


SOLUCIONADO Esto es lo que hice para que funcione:

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

Y el método de ayuda:

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

Lo primero es que no está usando una API api para subir las imágenes … ur usando la antigua API de reposo … intente usar la api del gráfico, es simple …

Use el siguiente código:

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

De acuerdo con el mensaje de error, parece que está dando errores al obtener bytes del paquete del bash …

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

prueba este código, funcionará, he usado el mismo código y cargo la imagen en Facebook.

Aquí está la muestra del código de trabajo. Pase la ruta de la imagen y el mensaje.

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

Estoy seguro de que Facebook arreglará esto eventualmente, pero por el momento estos ejemplos (publicados por otros usuarios) son muy engañosos porque de hecho NO se publican en el muro del usuario (en el sentido normal). En su lugar, se agregan a la galería de fotos del usuario y luego terminan en la pared, pero no de la misma manera en que funcionan las publicaciones normales … no hay título ni leyenda y si agrega otra foto, termina al lado del primero (en lugar de como una entrada separada). Entonces, cuando usas el comando api me / feed, simplemente falla de manera espectacular cuando realmente agrega una publicación al muro, pero es una publicación vacía de la aplicación (incluso ignora el título y el título).

Esperemos que Facebook arregle esto en algún momento a corto plazo.

Publicar la imagen y el muro de Texto a Facebook del código, una vez que haya iniciado sesión con las credenciales de Facebook.

nota: esto solo es aplicable después de iniciar sesión en su aplicación usando credenciales de 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(); }