2012-06-26 36 views
10

Tôi đang phát triển facebook nút để tích hợp với application.Here của tôi như là mã html sao chép từ developers.facebook.comFacebook Giống như nút chuyển hướng đến trang web trong facebook 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ã ngành android My

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

Khi ứng dụng bắt đầu nó kiểm tra xem tôi có đăng nhập vào facebook hay không. Nếu không, nó sẽ hiển thị màn hình đăng nhập facebook để đăng nhập và sau đó sau khi đăng nhập thành công, nó sẽ chuyển đến trang facebook của tôi thay vì trang ứng dụng Android của tôi.

Nếu phát hiện thấy tôi đã đăng nhập, khi đó màn hình sẽ hiển thị màn hình như bên dưới.

Xin hãy giúp tôi nơi tôi đang đi sai

màn hình đầu tiên của ứng dụng của tôi

my first screen

màn hình sau khi nhấp vào nút OK

2nd screen

khi clicki ng nút like trong webview của tôi, nó chuyển hướng đến liên kết facebook.com/connect/connect_to_external_page_reload.html. Xin hãy giúp tôi tôi nên làm gì?

Cảm ơn

+0

tôi đã sử dụng các thủ tục tương tự như bạn đã làm, nhưng nó không hiển thị các nút như trên WebView của tôi, bạn có biết làm thế nào tôi có thể xử lý vấn đề này không? Tôi đã đăng Câu hỏi tại đây http://stackoverflow.com/questions/16260322/how-to-use-facebook-like-button-in-android-application – Amt87

+0

kiểm tra bài đăng này, có thư viện được định dạng tốt để giải quyết vấn đề này: http://stackoverflow.com/a/23853937/1891118 –

Trả lời

6

tôi đoán là webview mà bạn nạp fb js sdk chỉ không có cookie và vì vậy người dùng không được chứng thực.

Bạn xác thực người dùng bằng cách nào? là nó sử dụng SSO (có nghĩa là, là ứng dụng fb cài đặt?) Nếu đó là trường hợp thì trình duyệt (webview) là không nhận thức được rằng người dùng được xác thực và khi bạn nhấp vào nó nó chỉ cố gắng chuyển hướng bạn để xác thực.

Đọc bài đăng blog chính thức mới: Bringing Like to Mobile.


Sửa

Vâng, điều này có vẻ đúng như tôi đoán. Bạn thấy rằng nó nói "Đăng ký để xem ..." có nghĩa là js sdk không nhận ra rằng người dùng đã đăng nhập và được xác thực.

Bạn có hai tùy chọn mà tôi có thể nghĩ đến:
1. Như tôi đã viết sử dụng hành động Like mới và tạo nút "giống như" của riêng bạn.
2.Khi gọi FB.init vượt qua các tham số authResponse với những gì bạn có từ android, sẽ giống như thế: phần

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 phần:

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

Tôi không phải là 100% chắc chắn rằng mẹo này sẽ hoạt động, vì một trong các tham số trong số authResponsesignedRequest mà bạn không có, nhưng nó đáng để thử.


2 Sửa

Khi ứng dụng facebook (katana) tồn tại trên thiết bị thì việc chứng thực được thực hiện sử dụng nó, có nghĩa là các tập tin cookie trên trình duyệt mặc định không được tạo ra và vì vậy khi bạn mở một webview với các nút như js sdk là không nhận thức được bạn đang đăng nhập, bạn có thể nghĩ về nó như đăng nhập vào facebook trên firefox, và sau đó mở một facebook trên chrome và thấy rằng bạn không đăng nhập.

Khi ứng dụng fb không được cài đặt sdk xác thực người dùng bằng hộp thoại với chế độ xem web, tạo ra các cookie có thể sau này ed bởi js sdk, đó là lý do tại sao nó hoạt động "như mong đợi" trong kịch bản này.

Cách giải quyết mà tôi đã cung cấp cho bạn trong bản chỉnh sửa đầu tiên của tôi sẽ cố chuyển dữ liệu xác thực đến sdk khi nó được khởi tạo.
Như tôi đã viết sau đó, tôi không chắc nó sẽ hoạt động, có lẽ bạn cũng cần phải vượt qua nó một yêu cầu đã ký, nhưng vì bạn không có nó, bạn sẽ cần phải tạo nó, nếu bạn muốn thử chỉ cần làm ngược lại chính xác những gì được mô tả ở đây: Singed Request, và sau đó chuyển nó đến FB.init cùng với mã thông báo truy cập và các thông số hết hạn.

Một tùy chọn khác mà bạn có là luôn sử dụng hộp thoại để xác thực, để đọc điều này: How to disable Facebook single sign on for android - Facebook-android-sdk.
Tôi khuyên bạn không nên sử dụng phương pháp đó vì nó dẫn đến trải nghiệm người dùng kém, sau khi nhập tất cả email và mật khẩu trên thiết bị di động không phải là điều thú vị.

+0

Nitzan vui lòng xem ảnh chụp màn hình của tôi mà tôi đã chỉnh sửa. –

+0

Đã chỉnh sửa câu trả lời của tôi. –

+0

Cảm ơn bạn đã trả lời. Tôi chắc chắn sẽ thử điều này. Tôi có cần phải tạo ra cái mông của riêng mình không? –

1

tôi đã cố gắng lựa chọn đầu tiên nhưng tôi có thể thấy chỉ trống gì webview khác trong ứng dụng Android của tôi

Các vấn đề liên quan