2012-06-26 13 views
10

estoy desarrollando Facebook como el botón de integrar con mi application.Here es el código HTML copiado de developers.facebook.comredireccionamiento al sitio en facebook androide

<html> 
<body>     
    <div id="fb-root"></div> 
    <script> 
     (function(d, s, id) { 
      var js, fjs = d.getElementsByTagName(s)[0]; 
      if (d.getElementById(id)) 
       return; 
      js = d.createElement(s); 
      js.id = id; 
      js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=my_app_id"; 
      fjs.parentNode.insertBefore(js, fjs); 
     }(document, 'script', 'facebook-jssdk')); 
    </script> 
    <fb:like data-href="http://www.facebook.com/facintegra" data-send="true" data-width="450" data-show-faces="false" data-font="tahoma"/> 
</body> 

Mi código de actividad androide

mWebView = (WebView) findViewById(R.id.webview); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    mWebView.getSettings().setAppCacheEnabled(true); 
    mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
    mWebView.loadUrl("file:///android_asset/FacebookLikeView.html"); 

    m_cObjFacebook = new Facebook("Your_id"); 

    authorizefacebook(); 

} 

private void authorizefacebook(){ 
    m_cObjFacebook.authorize(this, m_cPermissions, new DialogListener() { 
     @Override 
     public void onComplete(Bundle values) { 
      m_cAccessToken = values.getString(Facebook.TOKEN); 

     } 

     @Override 
     public void onFacebookError(FacebookError error) { 
      System.out.println(error.toString()); 
     } 

     @Override 
     public void onError(DialogError e) { 
      System.out.println(e.toString()); 
     } 

     @Override 
     public void onCancel() { 
      System.out.println("Cancel"); 
     } 
    }); 
} 
} 

Cuando se inicia la aplicación, comprueba si he iniciado sesión en Facebook o no. De lo contrario, muestra la pantalla de inicio de sesión de Facebook para iniciar sesión y luego de iniciar sesión correctamente, va a mi página de Facebook en lugar de a mi página de la aplicación de Android.

Si me encuentra conectado, aparece la pantalla de la siguiente manera.

Por favor, ayúdame, donde estoy saliendo mal

Primera pantalla de mi aplicación

my first screen

la pantalla después de hacer clic en el botón OK

2nd screen

cuando clicki Al hacer clic en el botón Me gusta en mi vista web, se redirige al enlace facebook.com/connect/connect_to_external_page_reload.html. Por favor, ayúdame, ¿qué debo hacer?

Gracias

+0

He utilizado el mismo procedimiento como lo hizo, pero no mostró el botón como en mi web View, ¿sabe cómo ¿Puedo manejar este problema? Publiqué una pregunta aquí http://stackoverflow.com/questions/16260322/how-to-use-facebook-like-button-in-android-application – Amt87

+0

mira esta publicación, hay una biblioteca bien formada para resolver este problema: http://stackoverflow.com/a/23853937/1891118 –

Respuesta

6

Mi conjetura es que la vista web en la que se carga el fb js SDK simplemente no tiene las cookies y por lo que el usuario no está autenticado.

¿Cómo se autentica al usuario? ¿está utilizando SSO (es decir, está instalada la aplicación fb?), si ese es el caso, entonces el navegador (webview) no está al tanto de que el usuario está autenticado y cuando hace clic simplemente intenta redirigirlo para la autenticación.

Lea la nueva publicación oficial del blog: Bringing Like to Mobile.


Editar

Bueno, esto se ve exactamente como supuse. Verá que dice "Registrarse para ver ...", lo que significa que js sdk no reconoce que el usuario está conectado y autenticado.

Tiene dos opciones que se me ocurren:
1. Como escribí, use la nueva acción Like y cree su propio "botón Me gusta".
2.Al llamar FB.init pasar el parámetro authResponse con lo que tiene de androide, quedará del siguiente modo:

Java parte

m_cObjFacebook = new Facebook("Your_id"); 
m_cObjFacebook.authorize(this, m_cPermissions, new DialogListener() { 
    @Override 
    public void onComplete(Bundle values) { 
     String response = m_cObjFacebook.request("me"); 
     JSONObject json = Util.parseJson(response); 
     showWebView(json.getString("id")); 
    } 

    .... 
}); 

private void showWebView(String userid) { 
    mWebView = (WebView) findViewById(R.id.webview); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    mWebView.getSettings().setAppCacheEnabled(true); 
    mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 

    StringBuilder url = new StringBuilder("file:///android_asset/FacebookLikeView.html?"); 
    url.append("token=").append(cObjFacebook.getAccessToken()); 
    url.append("&expires=").append(cObjFacebook.getAccessExpires()); 
    url.append("&user=").append(userid); 

    mWebView.loadUrl(url.toString()); 
} 

HTML/Javascript parte:

<script type="text/javascript"> 
    window.fbAsyncInit = function() { 
     var data = {}, 
      query = window.location.search.substring(1); 

     query = query.split("&"); 
     for (var i = 0; i < query.length; i++) { 
      var pair = query[i].split("="); 
      data[pair[0]] = pair[1]; 
     } 

     FB.init({ 
      appId: "YOUR_APP_ID", 
      xfbml: true, 
      authResponse: data 
     }); 
    }; 

    // Load the SDK Asynchronously 
    (function(d){ 
     var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; 
     if (d.getElementById(id)) {return;} 
     js = d.createElement('script'); js.id = id; js.async = true; 
     js.src = "//connect.facebook.net/en_US/all.js"; 
     ref.parentNode.insertBefore(js, ref); 
    }(document)); 
</script> 
<div class="fb-like" data-href="http://www.facebook.com/FacIntegra" data-send="false" data-width="450" data-show-faces="false" data-font="tahoma"></div> 

no estoy 100% Asegúrese de que este truco funcione, ya que uno de los parámetros en el authResponse es el signedRequest que no tiene, pero vale la pena intentarlo.


segunda edición

Cuando existe la función de Facebook (katana) en el dispositivo entonces la autenticación se realiza a usarlo, lo que significa que las cookies en el navegador por defecto no son creados y por lo tanto cuando se abre una vista web con el botón similar js sdk no sabe que está conectado, puede pensar en iniciar sesión en Facebook en Firefox, y luego abrir un facebook en Chrome y ver que no ha iniciado sesión.

Cuando el La aplicación fb no está instalada. El sdk autentica al usuario mediante un diálogo con una vista web, que crea las cookies que luego pueden ser utilizadas por nosotros. ed por js sdk, es por eso que funciona "como se esperaba" en este escenario.

La solución provisional que le di en mi primera edición trata de pasar los datos de autenticación a la SDK cuando se está inicializando.
Como escribí entonces, no estoy seguro de que funcione, tal vez también deba pasarle una solicitud firmada, pero como no la tiene, tendrá que crearla, si desea probarla. haga exactamente lo contrario de lo que se describe aquí: Singed Request, y luego páselo al FB.init junto con el token de acceso y los parámetros de expiración.

Otra opción que tiene es usar siempre el cuadro de diálogo para la autenticación, para eso lea esto: How to disable Facebook single sign on for android - Facebook-android-sdk.
No recomiendo utilizar este método ya que da como resultado una mala experiencia del usuario, después de todo, escribir mecanografía y contraseña en dispositivos móviles no es algo divertido de hacer.

+0

Nitzan por favor vea mis capturas de pantalla que he editado. –

+0

Editado mi respuesta. –

+0

Gracias por responder. Definitivamente probaré esto. ¿Tendré que crear mi propio Like butn? –

1

me trataron primera opción, pero sólo puedo ver nada en blanco vistaweb más en mi aplicación Android

Cuestiones relacionadas