Vista Web de Android
En mi aplicación, quiero que los usuarios puedan iniciar sesión con su cuenta de Facebook. Después de algunas búsquedas, soy capaz de averiguar esto aunque no creo que de esta manera es el mejor método. Utilicé una webview en mi interfaz de usuario y un webviewclient para detectar conmutaciones de url. Como entiendo, en Android, debo manejar todas las redirecciones en mi webviewclient (redirecciones de Facebook, varias redirecciones suceden cuando el usuario establece su correo electrónico y contraseña). Pero todo lo que necesito es analizar mi xml de salida y tomar una decisión de acuerdo al resultado de salida (redirigir a mi casa activiy o fallo, etc). Aquí está mi código, por favor dé sus sugerencias si el método más conveniente existe.
public class FbLoginActivity extends Activity { String fbLoginBaseUrl = "{my server url}/facebook/redirector.jsp?"; private ProgressDialog progressBar; WebView webView; int count = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fb_login); fbLoginBaseUrl += "usdId=NoSession:"; fbLoginBaseUrl += Subroutines.getInstance().getDeviceId() + "_L"; webView = (WebView) findViewById(R.id.webview); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); progressBar = ProgressDialog.show(FbLoginActivity.this, "", "Page is loading..."); webView.setWebViewClient(new HelloWebViewClient()); webView.loadUrl(fbLoginBaseUrl); } private class HelloWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); Log.v(Subroutines.TAG, url); return true; } @Override public void onPageFinished(WebView view, String url) { Log.i(Subroutines.TAG, "Finished loading URL: " +url); // if login screen loading finishes, cancel the progressdialog.. // twice redirecting happens to this sub url.. String subFace = "m.facebook.com/login.php"; if(url.indexOf(subFace) != -1 && ++count == 2){ if (progressBar.isShowing()) { progressBar.cancel(); } } // Permission redirecting.. String loginSub = "www.facebook.com/connect/uiserver.php?method=permissions.request"; if(url.indexOf(loginSub) != -1){ progressBar = ProgressDialog.show(FbLoginActivity.this, "", "Logging in..."); } // finally if my server makes a response.. String sub = "{my server url}/facebook/connect.jsp"; if(url.indexOf(sub) != -1){ Log.v(Subroutines.TAG, "my server makes a response.."); // xml parsing stuff.. // use url content to parse } } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Log.e(Subroutines.TAG, "Error: " + description); } } }
- El controlador onScaleChanged de WebView se llama varias veces
- WebView loadUrl sólo funciona una vez
- ShouldOverrideUrlLoading (...) no se ejecuta si "window.location.href" modificado en una devolución de llamada de tiempo de espera
- ¿Cuál es la diferencia entre setWebViewClient y setWebChromeClient?
- Android: cómo interceptar un formulario POST en android WebViewClient en el nivel 4 de API
- Cómo establecer un título diferente para el cuadro de diálogo de alerta cuando se carga la página WebView?
- Proguard warning biblioteca clase android.webkit.WebView depende de la clase del programa android.webkit.WebViewClien
- Android WebViewClient onReceivedError no se llama para un error 404
- Cómo obtener URL de enlace en Android WebView con HitTestResult para una imagen vinculada (y no la URL de imagen) con Longclick
- Obtener recursos de WebView que ya se ha descargado
- Abrir PDF en un WebView
- ShouldOverrideUrlLoading en WebView para Android no se está ejecutando
- Android: comprueba si la solicitud es GET o POST
Me gustaría obtener el SDK de Facebook y utilizar sus funciones
En pocas palabras usted hace esto:
public Facebook facebook = new Facebook("appID");
Luego en crear o en cualquier lugar:
facebook.authorize(this,String[] YourNeededPermissions, new DialogListener() { @Override public void onComplete(Bundle values) {} @Override public void onFacebookError(FacebookError error) {} @Override public void onError(DialogError e) {} @Override public void onCancel() {} });
Puedes ver esto aquí: http://developers.facebook.com/docs/guides/mobile/#android
Tengo realmente un problema similar en la integración del registro de Facebook con mi propio (pero no soy el desarrollador de Android). Le hice la pregunta aquí Facebook flujo de registro de Android, pero no sabía acerca de la webview. Que parece una buena solución, ¿Puedo contactar con usted por chat o por otros medios?
EDIT: Facebook acaba de actualizar su procedimiento de inicio de sesión: https://developers.facebook.com/docs/offline-access-deprecation/ como se puede ver, ahora el token que obtiene de SSO (o cualquier otro token de cliente) está vinculado sólo a su aplicación (hay una validación de token-app id-app secreto). El punto final es ahora
https://graph.facebook.com/oauth/access_token? client_id=APP_ID& client_secret=APP_SECRET& grant_type=fb_exchange_token& fb_exchange_token=EXISTING_ACCESS_TOKEN
Así que con el facebook sdk para android los pasos son: 1) obtener el usuario firmado 2) enviar el token al servidor 3) servidor de validar el token contra su app id y secreto de la aplicación 4) agregar sus propias características de seguridad