2012-06-26 18 views
10

Zajmuję Facebook Like przycisk, aby zintegrować z moim application.Here jest kod html skopiowane z developers.facebook.comFacebook Like button przekierowanie do facebook miejscu w 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> 

Mój android kodu aktywność

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

Po uruchomieniu aplikacji sprawdza, czy jestem zalogowany na Facebooku, czy nie. Jeśli nie, wyświetla ekran logowania do Facebooka, aby się zalogować, a po pomyślnym zalogowaniu przechodzi na moją stronę na Facebooku zamiast na stronę z moją aplikacją na Androida.

Jeśli wykryje, że jestem zalogowany, wyświetli ekran jak poniżej.

Proszę pomóż mi, gdzie mam zamiar źle

Pierwszy screen z mojego app

my first screen

ekran po kliknięciu przycisku OK

2nd screen

kiedy clicki ng przycisku podobnego w mojej webview, jego przekierowanie do linku facebook.com/connect/connect_to_external_page_reload.html. Pomóż mi, co mam zrobić?

Dzięki

+0

kiedyś taką samą procedurę jak ty, ale nie pokazują przycisk jak na mój Webview, wiesz jak czy mogę poradzić sobie z tym problemem? Wysłałem pytanie tutaj http://stackoverflow.com/questions/16260322/how-to-use-facebook-like-button-in-android-application – Amt87

+0

sprawdź ten post, jest dobrze utworzona biblioteka, aby rozwiązać ten problem: http://stackoverflow.com/a/23853937/1891118 –

Odpowiedz

6

Domyślam się, że WebView w którym załadować fb js SDK po prostu nie mają ciasteczka i tak, że użytkownik nie jest uwierzytelniony.

W jaki sposób uwierzytelniasz użytkownika? czy to przy użyciu SSO (to znaczy, czy jest zainstalowana aplikacja FB?), jeśli tak jest, to przeglądarka (przeglądarka internetowa) nie jest świadoma, że ​​użytkownik jest uwierzytelniany, a po kliknięciu go po prostu próbuje przekierować cię do uwierzytelnienia.

Przeczytaj nowy oficjalny post na blogu: Bringing Like to Mobile.


Edit

Cóż, to wygląda dokładnie tak, jak domyślił. Widzisz, że jest napisane "Zarejestruj się, aby zobaczyć ...", co oznacza, że ​​js sdk nie rozpoznaje, że użytkownik jest zalogowany i uwierzytelniony.

Masz dwie opcje, które mogę myśleć:
1. Jak pisałem użyć nowego Like działania i stworzyć własny przycisk „like”.
2.Dzwoniąc FB.init przekazać parametr authResponse z tym, co masz z Androida będzie wyglądać następująco: część

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 część:

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

nie jestem 100% pewien, że ta sztuczka zadziała, ponieważ jednym z parametrów w authResponse jest signedRequest, którego nie masz, ale warto spróbować.


2-ty Edit

Gdy istnieje aplikacja Facebook (katana) na urządzeniu, wówczas uwierzytelnianie odbywa się przy użyciu go, co oznacza, że ​​pliki cookie w przeglądarce domyślnej nie są tworzone, a więc po otwarciu webview z podobnym przyciskiem js sdk nie jest świadomy, że jesteś zalogowany, możesz myśleć o tym jak logując się do facebooka na firefox, a następnie otworzyć facebook na chrome i zobaczyć, że nie jesteś zalogowany.

Kiedy Aplikacja fb nie jest zainstalowana, sdk uwierzytelnia użytkownika za pomocą okna dialogowego z podglądem, który tworzy ciasteczka, które mogą być później ed przez js sdk, dlatego działa "zgodnie z oczekiwaniami" w tym scenariuszu.

Obejście, które podałem podczas pierwszej edycji, próbuje przekazać dane uwierzytelniające do SDK podczas inicjowania.
Tak jak napisałem, nie jestem pewien, czy to zadziała, może musisz również przekazać to podpisane żądanie, ale ponieważ nie masz go, musisz go utworzyć, jeśli chcesz spróbować po prostu wykonaj dokładnie odwrotność tego, co tutaj opisano: Singed Request, a następnie przekaż je do FB.init wraz z tokenem dostępu i wygasają parametry.

Inną dostępną opcją jest zawsze użycie okna dialogowego do uwierzytelniania, w tym celu przeczytaj: How to disable Facebook single sign on for android - Facebook-android-sdk.
Odradzam używanie tej metody, ponieważ powoduje ona złe wrażenia użytkownika, mimo że pisanie wszystkich wiadomości e-mail i hasła na urządzeniach mobilnych nie jest fajną rzeczą.

+0

Nitzan zobacz moje zrzuty ekranu, które edytowałem. –

+0

Zmieniono moją odpowiedź. –

+0

Dzięki za odpowiedź. Na pewno spróbuję tego. Czy muszę stworzyć własny Like Buttn? –

1

Próbowałem pierwszą opcję, ale widzę tylko pustą Webview nic innego w moim Android app

Powiązane problemy