2010-06-01 14 views
45

Estoy tratando de 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 programa 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.Android/Java: ¿publica texto simple en la pared de Facebook?

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 las bibliotecas de Java here 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 he tratado de jugar 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 que ya tiene una clave API de Facebook y el ID de aplicación.

[ACTUALIZACIÓN 1]

Para mayor aclaración: Si utilizo el siguiente fragmento de código con el oficial de Facebook Android SDK http://github.com/facebook/facebook-android-sdk lo que debería hacer a continuación (después de que el usuario ha iniciado la sesión en)? 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 "este" es una actividad que pone en práctica un DialogListener, y "[APP ID]" Facebook es mi ID de aplicación.

Gracias.

[ACTUALIZACIÓN 2]

he encontrado una solución (véase más adelante), aunque lo único que falta es la capacidad para rellenar 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.

+0

No he encontrado una manera de hacer esta actualización de estado "en segundo plano", sin mostrar un cuadro de diálogo. Intenté usar Graph API directamente con access_token proporcionado por SDK para Android, y simplemente no funciona. Sin excepciones, sin embargo. –

+0

Todavía estoy trabajando, pero la opción Single Sign-on puede iniciar sesión sin nombre de usuario/contraseña, si ya usan Facebook en su teléfono. Todavía solicita autorización. – HaMMeReD

+0

Amigo muchas gracias Me salvaste el culo. Tengo esto funcionando para la demostración de Tommorows. Pero todavía hay algunas cosas que necesito en mi intercambio de Facebook: - - ¿Puedo publicar una imagen junto con el texto en la pared? - ¿Puedo vincular todo el contenido de mi publicación al sitio web de mis clientes? Excepto que estoy feliz lo descubrí – abhishek

Respuesta

45

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. Descargar el Facebook oficial de Android SDK: http://github.com/facebook/facebook-android-sdk
  2. importar los archivos del proyecto en Eclipse.
  3. Exporte el proyecto como un archivo * .jar. (Esto podría causar un conflicto)

    [ACTUALIZACIÓN]

    Facebook ha actualizado recientemente el código fuente y me di cuenta el archivo de icono causó conflictos de ID 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. añadir el archivo .jar a la ruta de compilación de su proyecto

  5. mira 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); 
     } 
    } 
} 
 
+1

¿Qué proyecto debería exportarse como .jar? ¿El que está en la carpeta de Facebook (no en la carpeta de ejemplos)? Aparece una pantalla con muchas opciones sobre qué recursos deben exportarse, ¿qué debo elegir allí? Tnx – DixieFlatline

+0

Oye, todo lo que necesita es la carpeta de origen ("facebook") y los recursos, si le permite seleccionar eso también. Sin embargo, hay una cosa. Facebook cambió recientemente la fuente un poco y tuve problemas para importar el archivo jar resultante en mis proyectos (había un conflicto de id de recursos con el ícono de Facebook y un archivo en mis proyectos). Actualicé la solución para incluir la solución. Perdón por no responder antes. – RyanM

+0

En cuanto al comentario de if (! Values.containsKey ("post_id")) en la función onComplete, creo que puede simplemente pasar un nuevo DialogDelegate para el 4to argumento de facebookClient.dialog para evitar el problema. De todos modos, ¡gracias por un ejemplo muy útil! – 9re

1

Aquí es una respuesta objetiva a su nueva pregunta: "¿Qué hago ahora?"

Una mirada rápida en el código fuente me lleva a creer que esto es lo que hace:

Comprobar este URL para el resto (http://en.wikipedia.org/wiki/Representational_State_Transfer) métodos de la API se puede utilizar para dejar un comentario/mensaje:

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

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

salida 171 a través de las líneas 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 realizar estas solicitudes.

Probablemente desee este método (está sobrecargado, vea 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: 
* <code> 
* Bundle parameters = new Bundle(); 
* parameters.putString("method", "auth.expireSession"); 
* String response = request(parameters); 
* </code> 
* 
* @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) 
+0

Gracias por responder. Tus enlaces me ayudaron a darme cuenta de lo que tengo que hacer a continuación (publiqué la solución). 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. – RyanM

0

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.

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