Android WebView para Facebook como botón

Estoy tratando de hacer facebook como funcionalidad en Android WebView (especificación del proyecto no permite la apertura del navegador, o cualquier fuera de la actividad de la aplicación ).

Por lo tanto, las restricciones son que tiene que hacerse en WebView. He logrado hacer que sea un diálogo, y un clic del usuario en el botón, como (el WebView) redirecciona con éxito (en la misma vista) a la página de inicio de sesión de Facebooks. Después de la autenticación exitosa, el WebView (en un diálogo) se redirige a la página en blanco con encabezado de Facebook.

Curiosamente, cuando el usuario deja el cuadro de diálogo en blanco y haga clic de nuevo en el botón similar que funciona como perfectamente (como y al contrario) – de alguna manera mantiene la autenticación activa. Para resolver la página en blanco, he intentado / usado siguiendo:

  • Utilizando WebViewClient y shouldOverloadUrlForwarding para mantener todo el proceso en el mismo diálogo de WebView .
  • Utilizando WebChromeClient para ejecutar correctamente JavaScript – sin que después de iniciar sesión no es posible a like / unlike.
  • setUserAgentString() usar setUserAgentString() para simular otros navegadores como Chrome o Firefox
  • WebViewClient manejo del certificado del error del SSL (en el nivel 8 de la API) (en WebViewClient )

    @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); }

  • Utilizando (y toda la combinación posible de estos)

    webView.getSettings().setAppCacheEnabled(true); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

  • Intentó también persistir las galletas con CookieSyncManager , CookieManager y manejar manualmente.

Todo esto fue sin resultado. Realmente aprecio cualquier ayuda!

Para pasar la página en blanco, haz esto:

  webview.setWebViewClient(new LikeWebviewClient(this)); private class LikeWebviewClient extends WebViewClient { @Override public void onPageFinished(WebView view, String url) { Log.d(TAG, "onPageFinished url: " +url); // Facebook redirects to this url once a user has logged in, this is a blank page so we override this // http://www.facebook.com/connect/connect_to_external_page_widget_loggedin.php?............ if(url.startsWith("http://www.facebook.com/connect/connect_to_external_page_widget_loggedin.php")){ String redirectUrl = getFacebookLikeUrl(); view.loadUrl(redirectUrl); return; } super.onPageFinished(view, url); } } 

Tuve el mismo problema en mi aplicación Android. La causa del problema es FB login javascript abre una nueva página en una nueva ventana. A continuación, intenta cerrarlo después del éxito de inicio de sesión. Por favor, siga el ejemplo fluido de mis códigos de trabajo.

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0099cc" tools:context=".MyActivity" android:id="@+id/webview_frame"> <WebView android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> 

La vista Webview de id "webview" es la vista principal de mi contenido. Abajo están mis códigos de actividad.

 public class MyActivity extends Activity { /* URL saved to be loaded after fb login */ private static final String target_url="http://www.example.com"; private static final String target_url_prefix="www.example.com"; private Context mContext; private WebView mWebview; private WebView mWebviewPop; private FrameLayout mContainer; private long mLastBackPressTime = 0; private Toast mToast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_urimalo); // final View controlsView = // findViewById(R.id.fullscreen_content_controls); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); mWebview = (WebView) findViewById(R.id.webview); //mWebviewPop = (WebView) findViewById(R.id.webviewPop); mContainer = (FrameLayout) findViewById(R.id.webview_frame); WebSettings webSettings = mWebview.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setAppCacheEnabled(true); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setSupportMultipleWindows(true); mWebview.setWebViewClient(new UriWebViewClient()); mWebview.setWebChromeClient(new UriChromeClient()); mWebview.loadUrl(target_url); mContext=this.getApplicationContext(); } private class UriWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { String host = Uri.parse(url).getHost(); //Log.d("shouldOverrideUrlLoading", url); if (host.equals(target_url_prefix)) { // This is my web site, so do not override; let my WebView load // the page if(mWebviewPop!=null) { mWebviewPop.setVisibility(View.GONE); mContainer.removeView(mWebviewPop); mWebviewPop=null; } return false; } if(host.equals("m.facebook.com")) { return false; } // Otherwise, the link is not for a page on my site, so launch // another Activity that handles URLs Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { Log.d("onReceivedSslError", "onReceivedSslError"); //super.onReceivedSslError(view, handler, error); } } class UriChromeClient extends WebChromeClient { @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { mWebviewPop = new WebView(mContext); mWebviewPop.setVerticalScrollBarEnabled(false); mWebviewPop.setHorizontalScrollBarEnabled(false); mWebviewPop.setWebViewClient(new UriWebViewClient()); mWebviewPop.getSettings().setJavaScriptEnabled(true); mWebviewPop.getSettings().setSavePassword(false); mWebviewPop.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mContainer.addView(mWebviewPop); WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; transport.setWebView(mWebviewPop); resultMsg.sendToTarget(); return true; } @Override public void onCloseWindow(WebView window) { Log.d("onCloseWindow", "called"); } } } 

La clave para este problema es onCreateWindow . Se crea una nueva ventana y se inserta en el diseño del marco y se quita con éxito. He añadido la eliminación en shouldOverrideUrlLoading .

Tuve que trabajar a través de este casi exactamente el mismo problema en el iPhone. Lo que tenía que hacer era interceptar la solicitud que la webview hace a la "página en blanco" descrita anteriormente, y en su lugar decirle a la webview para cargar la URL como.

No funcionó para mí :(, pero la forma de observación i percibir que mal redireccionado enlace comenzó con

 url.startsWith("http://m.facebook.com/a/profile.php?fan&id")) 
  • WebView loadUrl sólo funciona una vez
  • ShouldOverrideUrlLoading en WebView para Android no se está ejecutando
  • Habilitación de JavaScript general en WebViewClient
  • URL de Soundcloud abierta en la aplicación nativa Soundcloud de WebView
  • Sube la foto de la cámara y el archivador de archivos desde el campo INPUT de la vista web
  • Log <GATE-M> DEV_ACTION_COMPLETED </ GATE-M> parece retrasar la ejecución en Android
  • Android WebClient, devolver un recurso de imagen a través de WebResourceResponse - no mostrar la imagen
  • Android JS en WebView.loadUrl ()
  • WebViewClient.onPageStarted () llamó dos veces al especificar URL no existente a través de WebView.loadURL ()
  • Interceptar y anular las solicitudes HTTP de WebView
  • OnPageStart se llama muchas veces y onPageFinished no se llama para una sola página
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.