2012-06-26 8 views
10

I Facebook Like Button entwickle mit meinem application.Here zu integrieren, ist der HTML-Code kopiert von developers.facebook.comFacebook Like Button Umleiten auf Facebook-Seite 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> 

Meine Android-Aktivitätscode

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

Beim Programmstart wird überprüft, ob ich bei Facebook angemeldet bin oder nicht. Ist dies nicht der Fall, wird der Facebook-Anmeldebildschirm angezeigt, um sich anzumelden. Nach erfolgreichem Login geht es dann auf meine Facebook-Seite statt auf meine Android-App-Seite.

Wenn es mich angemeldet, dann gibt es den Bildschirm wie folgt.

Bitte helfen Sie mir, wo ich falsch gehe

Erster Bildschirm meines app

my first screen

der Bildschirm nach dem Klicken auf die OK Taste

2nd screen

wenn Klick Wenn Sie in meinem Webview den gleichen Button drücken, wird der Link auf den Link facebook.com/connect/connect_to_external_page_reload.html umgeleitet. Bitte helfen Sie mir, was soll ich tun?

Dank

+0

ich das gleiche Verfahren verwendet sehen, wie Sie taten, aber es nicht zeigen, auf die Schaltfläche auf meine WebView, wissen Sie, wie kann ich mit diesem Problem umgehen? Ich habe hier eine Frage geschrieben http://StackOverflow.com/Questions/16260322/How-To-use-facebook-like-Button-in-android-application – Amt87

+0

überprüfen Sie diesen Beitrag, gibt es wohlgeformte Bibliothek, um dieses Problem zu lösen: http://StackOverflow.com/a/23853937/1891118 –

Antwort

6

Meine Vermutung ist, dass die Webansicht in dem Laden Sie die fb js sdk hat einfach nicht die Cookies und so wird der Benutzer nicht authentifiziert.

Wie authentifizieren Sie den Benutzer? Wird SSO verwendet (dh, ist die fb-App installiert?), erkennt der Browser (webview) nicht, dass der Benutzer authentifiziert ist. Wenn Sie darauf klicken, wird lediglich versucht, Sie zur Authentifizierung umzuleiten.

Lesen Sie den neuen offiziellen Blogpost: Bringing Like to Mobile.


bearbeiten

Nun, das sieht genauso aus, wie ich vermutete. Sie sehen, dass es "Sign up to see ..." bedeutet, dass die js sdk nicht erkennt, dass der Benutzer angemeldet und authentifiziert ist.

Sie haben zwei Möglichkeiten, die ich mich vorstellen kann:
1. Als ich die neue Like Aktion verwenden, geschrieben und Ihre eigenen „Like-Button“ erstellen.
2.Beim Aufruf FB.init den authResponse Parameter mit übergeben, was Sie von Android haben, wird etwas wie folgt aussehen:

Java Teil

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

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

ich nicht zu 100% bin sicher, dass dieser Trick funktioniert, denn einer der Parameter in der authResponse ist die signedRequest, die Sie nicht haben, aber es ist einen Versuch wert.


2. Bearbeiten

Wenn die Facebook-Anwendung (katana) auf dem Gerät vorhanden ist, dann die Authentifizierung es getan verwendet, was bedeutet, dass die Cookies auf dem Standard-Browser nicht erstellt werden, und so, wenn Sie öffnen ein Webview mit dem gleichen Knopf die js sdk ist nicht bewusst, dass Sie eingeloggt sind, können Sie sich wie in Facebook auf firefox anmelden, und öffnen Sie dann ein Facebook auf Chrom und sehen, dass Sie nicht angemeldet sind.

Wenn die fb app ist nicht installiert der sdk authentifiziert den Benutzer mit einem Dialog mit einer Webansicht, die die Cookies erstellt, die später uns sein können ed von der js sdk, deshalb funktioniert es "wie erwartet" in diesem Szenario.

Die Problemumgehung, die ich Ihnen in meiner ersten Bearbeitung gab, versucht, die Authentifizierungsdaten an das SDK zu übergeben, wenn es initialisiert wird.
Wie ich dann geschrieben habe, bin ich mir nicht sicher, ob es funktioniert, vielleicht müssen Sie es auch eine signierte Anfrage übergeben, aber da Sie es nicht haben, müssen Sie es erstellen, wenn Sie das versuchen möchten tun Sie genau das Gegenteil von dem, was hier beschrieben wird: Singed Request, und übergeben Sie es dann an die FB.init zusammen mit dem Zugriffstoken und Expire-Parameter.

Eine andere Option, die Sie haben, besteht darin, immer den Dialog zur Authentifizierung zu verwenden, für den das lesen: How to disable Facebook single sign on for android - Facebook-android-sdk.
Ich rate davon ab, diese Methode zu verwenden, da es zu einer schlechten Benutzererfahrung führt, nachdem das Eingeben von E-Mail und Kennwort auf mobilen Geräten keine lustige Sache ist.

+0

Nitzan bitte sehen Sie meine Screenshots, die ich bearbeitet habe. –

+0

Bearbeitete meine Antwort. –

+0

Danke für die Antwort. Ich werde das definitiv versuchen. Muss ich meinen eigenen Like-Button erstellen? –

1

Ich habe versucht, erste Option, aber ich kann nur leere Webansicht nichts anderes in meinem Android App

Verwandte Themen