Pregunta Android WebView para el botón Me gusta de Facebook


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

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 una autenticación exitosa, el WebView (en un diálogo) se redirige a página en blanco con 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 WebView diálogo.
  • utilizando WebChromeClient para ejecutar correctamente JavaScript sin él después de que el inicio de sesión no sea posible de me gusta / no me gusta.
  • intenté usar setUserAgentString() para simular otros navegadores como Chrome o Firefox
  • intentado con el manejo del certificado de error SSL (en el nivel de API 8) (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 manejo manual.

Todo esto fue sin resultado. Realmente lo aprecio alguna ¡ayuda!


20
2018-02-24 17:18


origen


Respuestas:


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

13
2017-08-22 09:31



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

los 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. Agregué la eliminación en shouldOverrideUrlLoading.


1
2017-09-28 14:55



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.


0
2018-03-31 00:18



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

0
2018-05-22 21:04



Preguntas populares