studio convert app android facebook webview facebook-like webviewclient

convert - javascript webview android



Android WebView para el botón Me gusta de Facebook (4)

Estoy intentando hacer que Facebook funcione como Android WebView (la especificación del proyecto no permite la apertura del navegador o cualquier actividad fuera de la aplicación ).

Entonces, las restricciones son que tiene que hacerse en WebView. Me las he arreglado para hacer un cuadro de diálogo, y después de un clic del usuario como botón, él (el WebView) redirige exitosamente (en la misma vista) a la página de inicio de sesión de facebook. Después de la autenticación exitosa, WebView (en un cuadro de diálogo) se redirige a la página en blanco con el encabezado de Facebook.

Curiosamente, cuando el usuario abandona el cuadro de diálogo en blanco y vuelve a hacer clic en el botón Me gusta funciona perfectamente (me gusta y no), de alguna manera mantiene la autenticación activa. Para resolver la página en blanco, he intentado / usado lo siguiente:

  • utilizando WebViewClient y shouldOverloadUrlForwarding para mantener todo el proceso en el mismo cuadro de diálogo de WebView .
  • usando WebChromeClient para ejecutar JavaScript correctamente - sin él después de que el inicio de sesión no sea WebChromeClient con like / unlike.
  • intenté usar setUserAgentString() para simular otros navegadores como Chrome o Firefox
  • intenté el manejo del certificado de error SSL (en el nivel 8 de API) (en WebViewClient )

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

  • usando (y todas las combinaciones posibles de estos)

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

  • Intenté también las cookies persistentes con CookieSyncManager , CookieManager y el manejo manual.

Todo esto fue sin resultado. Realmente aprecio cualquier ayuda!


No funcionó para mí :(, pero al observar la forma percibo que el enlace redireccionado incorrecto comenzó con

url.startsWith("http://m.facebook.com/a/profile.php?fan&id"))


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 de Android. La causa del problema es el inicio de sesión de FB javascript abre una nueva página en una nueva ventana. Luego intenta cerrarlo después del inicio de sesión exitoso. Por favor, sigue un 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. A continuación 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 que se inserta en el diseño del marco y se elimina cuando tiene éxito. shouldOverrideUrlLoading la eliminación en shouldOverrideUrlLoading .


Tuve que trabajar con este mismo problema casi exacto en iPhone. Lo que tuve que hacer fue interceptar la solicitud que hace la vista web a la ''página en blanco'' que describió anteriormente, y en cambio decirle a la vista web que cargue la URL similar.