Android / Java: ¿publica texto simple en el muro de Facebook?

Intento integrar la publicación en el muro desde mi aplicación. Ya tengo un área donde el usuario puede guardar su nombre de usuario y contraseña (encriptados). Me gustaría que mi progtwig recupere el nombre de usuario y la contraseña guardados, pasarlos a Facebook para su autenticación y luego permitir que la aplicación publique texto simple (quizás también un enlace) en el muro del usuario.

Dicho esto, he leído todo en las páginas de desarrollador en Facebook (la API me parece completamente ajena … Nunca antes había hecho ningún tipo de desarrollo de aplicaciones web … solo aplicaciones de escritorio) y experimenté con Java bibliotecas aquí, pero para ser sincero, no entiendo ninguna de las diversas implementaciones. Algunos dicen que es fácil de usar, pero aparentemente están muy por encima de mi cabeza.

Incluso intenté meterme con el SDK oficial de Android de Facebook, pero eso usa una interfaz de vista web, y no puedo ingresar el nombre de usuario y la contraseña para una autenticación fácil. Además, todavía no tengo ni idea de cómo publicar en la pared incluso después de la autenticación correcta.

Por favor ayuda. Gracias.

Ah, por cierto, ya tengo una clave de API de Facebook y una ID de aplicación.

[ACTUALIZACIÓN 1]

Para mayor aclaración: si utilizo el siguiente fragmento de código con el Facebook Facebook SDK oficial http://github.com/facebook/facebook-android-sdk ¿qué debo hacer a continuación (una vez que el usuario haya iniciado sesión)? Esto no está claro para mí.

Facebook facebookClient = new Facebook(); facebookClient.authorize(this, "[APP ID]", new String[] {"publish_stream", "read_stream", "offline_access"}, this); 

donde “esto” es una actividad que implementa un DialogListener, y “[ID de la aplicación]” es mi ID de aplicación de Facebook.

Gracias.

[ACTUALIZACIÓN 2]

Encontré una solución (ver más abajo), aunque lo único que falta es la capacidad de completar automáticamente los cuadros de texto de inicio de sesión con los datos que he almacenado en la aplicación. Es posible que el Android SDK oficial de Facebook no permita esto. Seguiré investigando.

Lo descubrí, con la ayuda de Tom (gracias). La clave era crear un diálogo con la llamada a la API “stream.publish”, utilizando Facebook Android SDK. Estos son los pasos:

  1. Descarga el SDK oficial de Android de Facebook: http://github.com/facebook/facebook-android-sdk
  2. Importe los archivos del proyecto en Eclipse.
  3. Exporte el proyecto como un archivo * .jar. (esto podría causar un conflicto)

    [ACTUALIZAR]

    Facebook actualizó recientemente el código fuente y noté que el archivo de íconos causó conflictos de identificación de recursos con mis proyectos (Android 1.5+). Mi solución es olvidarme de exportar como una jarra. En su lugar, copie la carpeta “com” de Facebook directamente en la carpeta “src” de la aplicación (es decir, “com.facebook.android” debe ser un paquete en su aplicación … junto con sus archivos de origen). Si ya tiene una carpeta “com” en su carpeta “src”, no se preocupe por los cuadros de diálogo que aparecen sobre sobrescribir archivos, ninguno de sus archivos fuente debe sobrescribirse. Regrese a Eclipse y actualice la carpeta “src” y “com.facebook.android” ahora debe aparecer como un paquete. Copie uno de los íconos de Facebook incluidos en la carpeta “dibujable” de su aplicación y actualice eso también. Eclipse se quejará del archivo “FbDialog.java” … simplemente agregue una importación que apunte al archivo “R” de su aplicación al encabezado de ese archivo (por ejemplo, si el nombre del paquete de su aplicación es “com.android.myapp”, luego agregue esto: “import com.android.myapp.R;”). Vaya a la # 5 si necesita hacer esto.

  4. Agregue el archivo .jar a la ruta de comstackción de su proyecto

  5. Mire el siguiente código de ejemplo simplificado:
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.LinearLayout; import com.facebook.android.*; import com.facebook.android.Facebook.DialogListener; public class FacebookActivity extends Activity implements DialogListener, OnClickListener { private Facebook facebookClient; private LinearLayout facebookButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.test);//my layout xml facebookButton = (LinearLayout)this.findViewById(R.id.Test_Facebook_Layout); } @Override public void onComplete(Bundle values) { if (values.isEmpty()) { //"skip" clicked ? return; } // if facebookClient.authorize(...) was successful, this runs // this also runs after successful post // after posting, "post_id" is added to the values bundle // I use that to differentiate between a call from // faceBook.authorize(...) and a call from a successful post // is there a better way of doing this? if (!values.containsKey("post_id")) { try { Bundle parameters = new Bundle(); parameters.putString("message", "this is a test");// the message to post to the wall facebookClient.dialog(this, "stream.publish", parameters, this);// "stream.publish" is an API call } catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } } } @Override public void onError(DialogError e) { System.out.println("Error: " + e.getMessage()); } @Override public void onFacebookError(FacebookError e) { System.out.println("Error: " + e.getMessage()); } @Override public void onCancel() { } @Override public void onClick(View v) { if (v == facebookButton) { facebookClient = new Facebook(); // replace APP_API_ID with your own facebookClient.authorize(this, APP_API_ID, new String[] {"publish_stream", "read_stream", "offline_access"}, this); } } }
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.LinearLayout; import com.facebook.android.*; import com.facebook.android.Facebook.DialogListener; public class FacebookActivity extends Activity implements DialogListener, OnClickListener { private Facebook facebookClient; private LinearLayout facebookButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.test);//my layout xml facebookButton = (LinearLayout)this.findViewById(R.id.Test_Facebook_Layout); } @Override public void onComplete(Bundle values) { if (values.isEmpty()) { //"skip" clicked ? return; } // if facebookClient.authorize(...) was successful, this runs // this also runs after successful post // after posting, "post_id" is added to the values bundle // I use that to differentiate between a call from // faceBook.authorize(...) and a call from a successful post // is there a better way of doing this? if (!values.containsKey("post_id")) { try { Bundle parameters = new Bundle(); parameters.putString("message", "this is a test");// the message to post to the wall facebookClient.dialog(this, "stream.publish", parameters, this);// "stream.publish" is an API call } catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } } } @Override public void onError(DialogError e) { System.out.println("Error: " + e.getMessage()); } @Override public void onFacebookError(FacebookError e) { System.out.println("Error: " + e.getMessage()); } @Override public void onCancel() { } @Override public void onClick(View v) { if (v == facebookButton) { facebookClient = new Facebook(); // replace APP_API_ID with your own facebookClient.authorize(this, APP_API_ID, new String[] {"publish_stream", "read_stream", "offline_access"}, this); } } } 
 AsyncFacebookRunner mAsyncRunner; Facebook facebook =new Facebook("Your app id"); 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 postOnWall(String msg) { Log.d("Tests", "Testing graph API wall post"); try { String response = facebook.request("me"); Bundle parameters = new Bundle(); parameters.putString("message", msg); parameters.putString("description", "test test test"); response = facebook.request("me/feed", parameters, "POST"); Log.d("Tests", "got response: " + response); if (response == null || response.equals("") || response.equals("false")) { Log.v("Error", "Blank response"); } } catch(Exception e) { e.printStackTrace(); } 

Aquí hay una respuesta objetiva a su nueva pregunta: “¿Qué debo hacer ahora?”

Una rápida mirada al código fuente me lleva a creer que esto es lo que haces:

Consulte esta URL para conocer los métodos de la API REST ( http://en.wikipedia.org/wiki/Representational_State_Transfer ) que puede usar para dejar un comentario / publicación:

http://developers.facebook.com/docs/reference/rest/

Específicamente esto: http://developers.facebook.com/docs/reference/rest/links.post

Vea las líneas 171 a 295 de Facebook.java http://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/android/Facebook.java

Para ver cómo usar la API para hacer estas solicitudes.

Probablemente quieras este método (está sobrecargado, mira el código).

  /** * Make a request to Facebook's old (pre-graph) API with the given * parameters. One of the parameter keys must be "method" and its value * should be a valid REST server API method. * * See http://developers.facebook.com/docs/reference/rest/ * * Note that this method blocks waiting for a network response, so do not * call it in a UI thread. * * Example: *  * Bundle parameters = new Bundle(); * parameters.putString("method", "auth.expireSession"); * String response = request(parameters); *  * * @param parameters * Key-value pairs of parameters to the request. Refer to the * documentation: one of the parameters must be "method". * @throws IOException * if a network error occurs * @throws MalformedURLException * if accessing an invalid endpoint * @throws IllegalArgumentException * if one of the parameters is not "method" * @return JSON string representation of the response */ public String request(Bundle parameters) 

Para aquellos que tienen problemas, en el nuevo facebook (); , la cadena es tu App_id, y simplemente borra APP_ID en la llamada autorizada.

No sé por qué se muestra el mensaje de error, pero supongo que Facebook actualizó el SDK de Facebook.