2012-06-26 3 views
10

Я разрабатываю Facebook кнопка интеграции с моей application.Here как это HTML код копируется из developers.facebook.comFacebook Как кнопка перенаправление на сайт facebook в андроиде

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

Моего андроида код активность

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

Когда приложение запускается, оно проверяет, вошел ли я в систему на Facebook или нет. Если нет, он отображает экран входа в систему для входа в систему, а затем после успешного входа в систему он переходит на мою страницу на facebook, а не на страницу приложения для Android.

Если он обнаружит, что я вошел в систему, он дает экран, как показано ниже.

Пожалуйста, помогите мне, где я буду неправильно

Первый экран моего приложения

my first screen

экран после нажатия кнопки OK

2nd screen

когда clicki ng подобную кнопку в моем веб-просмотре, ее перенаправление на ссылку facebook.com/connect/connect_to_external_page_reload.html. Пожалуйста, помогите мне, что мне делать?

Благодаря

+0

я использовал ту же процедуру, как вы делали, но это не показать кнопку, как на моем WebView, вы знаете, как могу ли я справиться с этой проблемой? Я разместил вопрос здесь http://stackoverflow.com/questions/16260322/how-to-use-facebook-like-button-in-android-application – Amt87

+0

проверить этот пост, есть хорошо сформированная библиотека для решения этой проблемы: http://stackoverflow.com/a/23853937/1891118 –

ответ

6

Я думаю, что WebView, в котором вы загрузите фб JS SDK просто не имеет куки и поэтому пользователь не прошел проверку подлинности.

Как вы аутентифицируете пользователя? используется ли SSO (то есть установлено ли приложение fb?), если это так, то браузер (webview) не знает, что пользователь аутентифицирован, и когда вы нажимаете на него, он просто пытается перенаправить вас на аутентификацию.

Читать новое официальное сообщение в блоге: Bringing Like to Mobile.


Редактировать

Ну, это выглядит точно так же, как я догадался. Вы видите, что он говорит «Зарегистрироваться, чтобы увидеть ...», что означает, что js sdk не распознает, что пользователь вошел в систему и прошел аутентификацию.

У вас есть два варианта, о которых я могу думать:
1. Как я писал, используйте новое действие Like и создайте свою собственную кнопку «как кнопка».
2.При вызове FB.init передать параметр authResponse с тем, что у вас есть от андроида, будет выглядеть примерно так:

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 часть:

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

Я не 100% что этот трюк будет работать, поскольку один из параметров в authResponse - это signedRequest, которого у вас нет, но стоит попробовать.


второй Редактировать

Когда приложение facebook (катана) существует на устройстве, то аутентификация выполняется с помощью его, что означает, что куки в браузере по умолчанию не создаются и поэтому при открытии webview с подобной кнопкой js sdk не знает, что вы вошли в систему, вы можете подумать об этом, как войти в facebook на firefox, а затем открыть фейсбук на хроме и посмотреть, что вы не вошли в систему.

Когда Приложение fb не установлено. sdk аутентифицирует пользователя, используя диалог с веб-просмотром, который создает файлы cookie, которые могут быть позже нами. ed js sdk, поэтому он работает «как ожидалось» в этом сценарии.

Обходной путь, который я дал вам в своем первом редактировании, пытается передать данные аутентификации в sdk, когда он инициализируется.
Как я уже писал, я не уверен, что это сработает, возможно, вам также нужно передать ему подписанный запрос, но, поскольку у вас его нет, вам нужно его создать, если вы хотите попробовать это просто выполните полную противоположность тому, что описано здесь: Singed Request, а затем передайте его FB.init вместе с параметрами токена доступа и истечением срока действия.

Другой вариант, который у вас есть, - это всегда использовать диалог для аутентификации, для этого читайте это: How to disable Facebook single sign on for android - Facebook-android-sdk.
Советуем не использовать этот метод, так как это приводит к плохим пользовательским ощущениям, ведь набирать электронную почту и пароль на мобильных устройствах не очень забавно.

+0

Nitzan, пожалуйста, посмотрите мои снимки экрана, которые я редактировал. –

+0

Отредактировал свой ответ. –

+0

Спасибо за ответ. Я обязательно попробую это. Должен ли я создать свой собственный Like buttn? –

1

я попробовал первый вариант, но я не могу видеть только пустой Webview ничего другого в моем андроид приложения

Смежные вопросы