Estoy intentando una aplicación simple para leer en el HTML de un sitio web, y transformarla para crear una interfaz de usuario fácil de leer en Android (esta es una práctica más en Android, no para crear aplicación utilizable). El problema que tengo es persistir en la sesión de un usuario en las actividades y luego utilizar la sesión en un HttpClient
una vez que se acordó.Uso de cookies en las actividades al utilizar HttpClient
Me gustaría hacer esto "Correctamente", el enfoque recomendado parece ser usar CookieManager
. Sin embargo, he tenido problemas con esto. Parece que no puedo encontrar la forma "Correcta" de tomar un Cookie
desde el CookieManager
y usarlo en una instancia posterior de HttpClient
en actividades separadas.
Al usar un CookieManager
puedo guardar el Cookie
y el Cookie
está en el alcance de otras actividades (Vea el fragmento de código 2). No he encontrado cómo usar esto más tarde (Ver el fragmento de código 3) cuando solicito una página.
Basta de hablar, aquí hay un código. Primero mi acción de acceso y almacenamiento de cookies:
private OnClickListener loginActionListener = new OnClickListener()
{
public void onClick(View v)
{
EditText usernameTextView = (EditText) findViewById(R.id.Username);
EditText passwordTextView = (EditText) findViewById(R.id.Password);
String username = usernameTextView.getText().toString();
String password = passwordTextView.getText().toString();
try {
HttpPost postMethod = new HttpPost(URI);
HttpParams params = new BasicHttpParams();
params.setParameter("mode", "login");
params.setParameter("autologin", true);
params.setParameter("username", username);
params.setParameter("password", password);
postMethod.setParams(params);
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(postMethod);
List<Cookie> cookies = httpClient.getCookieStore().getCookies();
if(cookies != null)
{
for(Cookie cookie : cookies)
{
String cookieString = cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain();
CookieManager.getInstance().setCookie(cookie.getDomain(), cookieString);
}
}
CookieSyncManager.getInstance().sync();
Intent intent = new Intent(v.getContext(), IndexAction.class);
startActivity(intent);
} catch (Exception e) {...}
}
La actividad de inicio que decide carnero para hacer la conexión del usuario o ir al índice está por debajo. Se puede ver en el código que la cookie es en su alcance y se puede leer:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CookieSyncManager.createInstance(this);
if(CookieManager.getInstance().getCookie(URI) == null)
{
Intent intent = new Intent(this, LoginAction.class);
startActivity(intent);
}
else
{
Intent intent = new Intent(this, IndexAction.class);
startActivity(intent);
}
}
Pero desde mi código para leer la página Índice Estoy esperando que usted puede sugerir lo que me falta:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CookieSyncManager.createInstance(this);
try
{
HttpGet getMethod = new HttpGet(URI_INDEX);
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 30000);
HttpConnectionParams.setSoTimeout(params, 30000);
// This code results in a ClassCastException, I'm assuming i've found a red herring with this solution.
// HttpContext localContext = new BasicHttpContext();
// localContext.setAttribute(ClientContext.COOKIE_STORE, CookieManager.getInstance().getCookie(URI));
DefaultHttpClient httpClient = new DefaultHttpClient(params);
HttpResponse response = httpClient.execute(getMethod);
if(response.getStatusLine().getStatusCode() > 299 && response.getStatusLine().getStatusCode() < 400)
{
// Not logged in doesn't give a redirect response. Very annoying.
}
final char[] buffer = new char[0x10000];
StringBuilder out = new StringBuilder();
Reader in = new InputStreamReader(response.getEntity().getContent(), "UTF-8");
int read = 0;
while (read>=0)
{
read = in.read(buffer, 0, buffer.length);
if (read>0) {
out.append(buffer, 0, read);
}
}
String returnString = out.toString();
} catch (ClientProtocolException e) {...}
}
El HttpClient
en execute(getMethod)
no está utilizando la Cookie (comprobó esto en depuración) para volver a abrir la página. Sería genial si alguien pudiera llenar este hoyo en mi conocimiento.
Gracias de antemano.
EDITAR
Cuando se añade código comentado de nuevo en (con el cambio httpClient.execute(getMethod)
método para httpClient.execute(getMethod, localContext)
) esta traza strack se produce - Supuestamente porque estoy llenando el atributo ClientContext.COOKIE_STORE
con un Cookie
String
en lugar de un CookieStore
:
*org.apache.http.client.protocol.RequestAddCookies.process(RequestAddCookies.java:88), org.apache.http.protocol.BasicHttpProcessor.process(BasicHttpProcessor.java:290), org.apache.http.protocol.HttpRequestExecutor.preProcess(HttpRequestExecutor.java:160), org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:401)
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555), org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487),
com.testapp.site.name.IndexAction.onCreate(IndexAction.java:47),
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047),
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611),
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663),
android.app.ActivityThread.access$1500(ActivityThread.java:117),
android.app.ActivityThread$H.handleMessage(ActivityThread.java:931),
android.os.Handler.dispatchMessage(Handler.java:99),
android.os.Looper.loop(Looper.java:123),
android.app.ActivityThread.main(ActivityThread.java:3683),
java.lang.reflect.Method.invokeNative(Native Method),
java.lang.reflect.Method.invoke(Method.java:507),
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839),
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597),
dalvik.system.NativeStart.main(Native Method)*
¿Podría proporcionar el seguimiento de la pila de su excepción? Esta pregunta puede ayudar: http://stackoverflow.com/questions/1652850/android-webview-cookie-problem – Mikaveli
Y posiblemente http://stackoverflow.com/questions/678630/how-do-i-make-an-http -request-using-cookies-on-android – Mikaveli
No ayuda que httpClient.getCookieStore(). addCookie (Cookie) necesite un objeto Cookie y CookieManager.getInstance(). getCookie (URI) devuelve una cadena. Cookie es una interfaz y no sé qué subtipo utilizar. – Graeme