sistema sesion requiere porque pide notificacion inicio iniciar como autorizacion abierta android httpclient wifi

requiere - sistema android iniciar sesion en la red



Detectar y manejar la necesidad de iniciar sesiĆ³n para wifi (3)

Como un caso más general: puede incluir algo en su API pública como un mensaje de "Hola mundo" o "Ping".

GET http://api.example.com/1.0/ping HTTP/1.1 Accepts: text/json Content-Type: text/json { ping: "ok", currentAPIVersion: 1.1, minAPIVersion: 1.0 }

Intente conectar y hacer ping a su servidor. Si la respuesta no se devuelve en el formato que espera, arroje la misma URL como Intento para que el usuario se ocupe de los resultados utilizando el navegador web que elija.

Esto también se manejaría: los proxies corporativos ("¡la compañía XYZ te lo prohíbe!") Y los cambios incompatibles en tu propia API en el futuro ("lo sentimos, ya no admitimos esa versión de 12 años de la API. Por favor, descarga una actualización allí. . ”)

Estoy usando HttpClient 4.1 en una aplicación de Android y trato de hacerlo inteligente para que las solicitudes de API de mi aplicación sean interceptadas por una de esas pantallas de "es necesario iniciar sesión o pagar por wifi".

Quiero abrir una vista web que permite al usuario iniciar sesión.

He estado intentando interceptar la redirección en httpClient, pero no lo he conseguido.

Esto es lo que estoy tratando actualmente:

this.client = new DefaultHttpClient(connectionManager, params); ((DefaultHttpClient) this.client).setRedirectStrategy(new DefaultRedirectStrategy() { public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) { boolean isRedirect = Boolean.FALSE; try { isRedirect = super.isRedirected(request, response, context); } catch (ProtocolException e) { Log.e(TAG, "Failed to run isRedirected", e); } if (!isRedirect) { int responseCode = response.getStatusLine().getStatusCode(); if (responseCode == 301 || responseCode == 302) { throw new WifiLoginNeeded(); // The "real implementation" should return true here.. } } else { throw new WifiLoginNeeded(); } return isRedirect; } });

Y luego en mi actividad:

try { response = httpClient.get(url); } catch (WifiLoginNeeded e){ showWifiLoginScreen(); }

donde la pantalla wifi del show hace esto:

Uri uri = Uri.parse("http://our-site.com/wifi-login"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);

El pensamiento es este:

  • Mi API nunca redireccionará legítimamente
  • Así que configuro HttpClient para lanzar mi RuntimeException especial cuando se redirige
  • Capture esa excepción en el código de actividad y abra una vista Web para que se dirijan a la pantalla de inicio de sesión
  • Una vez que inician sesión, wifi-login los felicita por un trabajo bien hecho y los vuelve a ingresar a la aplicación

La cosa es que nunca recibí esa excepción WifiLoginNeeded. ¿Cuál es la forma preferida de lograr esto con Android?


Por favor revise el siguiente código. Puede ser útil para usted verificar qué tipo de conexiones está utilizando.

WifiManager lWifiManager = (WifiManager) OpenYouTubePlayerActivity.this.getSystemService(Context.WIFI_SERVICE); TelephonyManager lTelephonyManager = (TelephonyManager) OpenYouTubePlayerActivity.this.getSystemService(Context.TELEPHONY_SERVICE); //////////////////////////// // if we have a fast connection (wifi or 3g) if( (lWifiManager.isWifiEnabled() && lWifiManager.getConnectionInfo() != null && lWifiManager.getConnectionInfo().getIpAddress() != 0) || ( (lTelephonyManager.getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS || /* icky... using literals to make backwards compatible with 1.5 and 1.6 */ lTelephonyManager.getNetworkType() == 9 /*HSUPA*/ || lTelephonyManager.getNetworkType() == 10 /*HSPA*/ || lTelephonyManager.getNetworkType() == 8 /*HSDPA*/ || lTelephonyManager.getNetworkType() == 5 /*EVDO_0*/ || lTelephonyManager.getNetworkType() == 6 /*EVDO A*/) && lTelephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED) ){ //Do some thing here }


Prueba esta pequeña solución que te ayudará.

public boolean haveNetworkConnection() { cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); Boolean haveConnectedWifi = false; Boolean haveConnectedMobile = false; NetworkInfo[] netInfo = cm.getAllNetworkInfo(); for (NetworkInfo ni : netInfo) { if (ni.getTypeName().equalsIgnoreCase("WIFI")) if (ni.isConnected()) haveConnectedWifi = true; if (ni.getTypeName().equalsIgnoreCase("MOBILE")) if (ni.isConnected()) haveConnectedMobile = true; } return haveConnectedWifi || haveConnectedMobile; }