2012-06-26 14 views
10

sto sviluppando facebook pulsante per integrarsi con la mia application.Here come è il codice html copiato da developers.facebook.comFacebook Like reindirizzamento al sito di Facebook in Android

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

mio codice attività Android

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

All'avvio dell'applicazione, controlla se sono connesso a Facebook o meno. In caso contrario, visualizza la schermata di accesso di Facebook per effettuare il log-in e, dopo il log-in, va alla mia pagina Facebook invece della mia pagina di app Android.

Se mi viene effettuata la connessione, viene visualizzata la schermata come di seguito.

Please help me dove sto andando male

prima schermata della mia app

my first screen

lo schermo dopo aver fatto clic sul pulsante OK

2nd screen

quando clicki il pulsante mi piace nella mia webview, il suo reindirizzamento al link facebook.com/connect/connect_to_external_page_reload.html. Per favore aiutami cosa dovrei fare?

Grazie

+0

ho usato la stessa procedura che avete fatto, ma non ha mostrato il pulsante mi piace sul mio WebView, sai come posso gestire questo problema? Ho postato una domanda qui http://stackoverflow.com/questions/16260322/how-to-use-facebook-like-button-in-android-application – Amt87

+0

controlla questo post, c'è una biblioteca ben strutturata per risolvere questo problema: http://stackoverflow.com/a/23853937/1891118 –

risposta

6

La mia ipotesi è che la WebView in cui si carica il fb js sdk semplicemente non ha i cookie e così l'utente non è autenticato.

Come si autentica l'utente? sta usando SSO (cioè, l'app fb è installata?) se questo è il caso, allora il browser (webview) non è a conoscenza che l'utente è autenticato e quando lo fai clic cerca semplicemente di reindirizzare l'utente per l'autenticazione.

Leggi il nuovo post del blog ufficiale: Bringing Like to Mobile.


Modifica

Beh, questo sembra esattamente come ho indovinato. Si vede che dice "Registrati per vedere ..." significa che js sdk non riconosce che l'utente è loggato e autenticato.

si hanno due opzioni che mi viene in mente:
1. Come ho scritto utilizzare il nuovo Like azione e creare il proprio "pulsante mi piace".
2.Quando si chiama FB.init passare il parametro authResponse con quello che hai da Android, avrà un aspetto simile: parte

Java

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> 

io non sono al 100% sicuro che questo trucco funzionerà, dal momento che uno dei parametri nel authResponse è il signedRequest che non hai, ma vale la pena provare.


2 ° Modifica

Quando l'applicazione facebook (katana) presente sul dispositivo, quindi l'autenticazione viene fatto usando esso, il che significa che i cookie sul browser predefinito non vengono creati e così quando si apre un webview con il pulsante mi piace js sdk non si è accorti di aver effettuato l'accesso, si può pensare ad esso come accedere a Facebook su firefox e quindi aprire un facebook su chrome e vedere che non si è loggati.

Quando il l'app fb non è installata il sdk autentica l'utente usando una finestra di dialogo con una webview, che crea i cookie che possono essere in seguito noi edita da js sdk, è per questo che funziona "come previsto" in questo scenario.

La soluzione che ti ho dato nella prima modifica tenta di passare i dati di autenticazione allo sdk quando viene inizializzato.
Come ho scritto allora, non sono sicuro che funzionerà, forse anche tu devi passargli una richiesta firmata, ma dato che non ce l'hai, dovrai crearlo, se vuoi provarlo Esegui esattamente l'esatto opposto di quanto descritto qui: Singed Request, quindi passalo allo FB.init insieme al token di accesso e ai parametri di scadenza.

Un'altra opzione è quella di utilizzare sempre la finestra di dialogo per l'autenticazione, per cui leggere questo: How to disable Facebook single sign on for android - Facebook-android-sdk.
Sconsiglio di utilizzare tale metodo poiché risulta un'esperienza utente negativa, dopotutto digitare e-mail e password sui dispositivi mobili non è una cosa divertente da fare.

+0

Nitzan per favore guarda le mie schermate che ho modificato. –

+0

Modificato la mia risposta. –

+0

Grazie per la risposta. Lo proverò sicuramente. Avrò bisogno di creare il mio Like buttn? –

1

ho provato prima opzione, ma posso solo vedere nulla WebView vuota altro nel mio app Android