Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] WebView, Cookies, prise de tête ...

    13 février 2013 à 11:30:02

    Bonjour,

    Le contexte :

    Une application Android : Sdk mini : 8, sdk maxi : 17, librairie annexe : ActionBarSherlock.

    Un site internet en PHP :  Version PHP : 5.4, HTML 5, CSS 3, media-queries.

    L'application permet la connexion au site via un formulaire. Ce formulaire est une activity de l'application. L'envoie de la requête Post ainsi que la réception du cookie de session ainsi que de mon cookie perso, sont ok. Si l'authentification est bonne une nouvelle activity est lancée. Cette nouvelle activity comporte une action bar ainsi qu'une tab action bar (d'où l'utilisation d'ActionBarSherlock pour la compatibilité avec les anciennes version d'Android), elle comporte également une WebView afin d'afficher les différentes pages du site.

    J'ai déjà testé de nombreuses solutions, idées, voire délire de fous furieux ;p

    Bref voici la version de test actuelle :

    La classe de login :

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.cookie.Cookie;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.net.ConnectivityManager;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class XXX_LogScreen extends Activity implements OnClickListener{
    	
    	public String sLogin = null;
    	public String sPassword = null;
    		
    	private EditText login = null;
    	private EditText password = null;
    		
    	private Button guest = null;
    	private Button submit = null;
    	
    	static DefaultHttpClient httpClient = ICL_AppSettings.getClient();
    	
    	public static Cookie cookie = null;
    	
    	@Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.log_screen);
    
            login = (EditText) findViewById(R.id.login_etw);
    		password = (EditText) findViewById(R.id.password_etw);
    		
    		guest = (Button) findViewById(R.id.guest_b);
    		submit = (Button) findViewById(R.id.submit_b);
    		
    		guest.setOnClickListener(this);
    		submit.setOnClickListener(this);
        }
        
        public boolean isNetworkAvailable() {
    
    		ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    		
    		return cm.getActiveNetworkInfo().isConnectedOrConnecting();
    	}
    
    	@Override
    	public void onClick(View v) {
    
    		if(v.getId() == R.id.guest_b){
    			
    			sLogin = "guest";
    			sPassword = "pass_guest";
    			
    			if (isNetworkAvailable()) {
    				
    				sendPostRequest(sLogin, sPassword);
    			}
    			
    			else {
    				
    				Toast.makeText(XXX_LogScreen.this, "Vous n'êtes pas connecté à Internet.", Toast.LENGTH_LONG).show();
    			}
    		}
    		
    		else if(v.getId() == R.id.submit_b){
    			
    			sLogin = login.getEditableText().toString();
    			sPassword = password.getEditableText().toString();
    
    			System.out.println("Given username :" + sLogin + " Given password :" + sPassword);
    
    			if (sLogin.length() == 0) {
    				
    				Toast.makeText(XXX_LogScreen.this, "Veuillez saisir votre adresse email.", Toast.LENGTH_LONG).show();
    			}
    			
    			else if (sPassword.length() == 0){
    				
    				Toast.makeText(XXX_LogScreen.this, "Veuillez saisir votre mot de passe.", Toast.LENGTH_LONG).show();
    			}
    			
    			else {
    				
    				if (isNetworkAvailable()) {
    				
    					sendPostRequest(sLogin, sPassword);
    				}
    				
    				else {
    					
    					Toast.makeText(XXX_LogScreen.this, "Vous n'êtes pas connecté à internet.", Toast.LENGTH_LONG).show();
    				}
    			}
    		}	
    	}
    
    	private void sendPostRequest(String givenUsername, String givenPassword) {
    
    		class SendPostReqAsyncTask extends AsyncTask<String, Void, String>{
    
    			@Override
    			protected String doInBackground(String... params) {
    
    				String paramUsername = params[0];
    				String paramPassword = params[1];
    
    				System.out.println("*** doInBackground ** paramUsername : " + paramUsername + " paramPassword : " + paramPassword);
    
    				HttpPost httpPost = new HttpPost("http://www.xxxxxxxxx.xxx/xxxxxxxx/app_connect.php");
    
    				BasicNameValuePair usernameBasicNameValuePair = new BasicNameValuePair("paramUsername", paramUsername);
    				BasicNameValuePair passwordBasicNameValuePAir = new BasicNameValuePair("paramPassword", paramPassword);
    
    				List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
    				nameValuePairList.add(usernameBasicNameValuePair);
    				nameValuePairList.add(passwordBasicNameValuePAir);
    
    				try {
    
    					UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairList);
    
    					httpPost.setEntity(urlEncodedFormEntity);
    
    					try {
    
    						HttpResponse httpResponse = httpClient.execute(httpPost);
    						
    						System.out.println("Post logon cookies:");
    						
    				        List<Cookie> cookies = httpClient.getCookieStore().getCookies();
    						
    				        if (cookies.isEmpty()) {
    				        	
    				            System.out.println("None");
    				            
    				        } 
    				        
    				        else {
    				        	
    				            for (int i = 0; i < cookies.size(); i++) {
    				            	
    				            	cookie = cookies.get(i);
    				            	
    				            	System.out.println("- " + cookies.get(i).toString());
    				            	
    				            }
    				        }
    
    						InputStream inputStream = httpResponse.getEntity().getContent();
    
    						InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
    
    						BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    
    						StringBuilder stringBuilder = new StringBuilder();
    
    						String bufferedStrChunk = null;
    
    						while((bufferedStrChunk = bufferedReader.readLine()) != null){
    							
    							stringBuilder.append(bufferedStrChunk);
    						}
    
    						return stringBuilder.toString();
    
    					} catch (ClientProtocolException cpe) {
    						
    						System.out.println("First Exception caz of HttpResponese :" + cpe);
    						cpe.printStackTrace();
    						
    					} catch (IOException ioe) {
    						
    						System.out.println("Second Exception caz of HttpResponse :" + ioe);
    						ioe.printStackTrace();
    					}
    
    				} catch (UnsupportedEncodingException uee) {
    					
    					System.out.println("An Exception given because of UrlEncodedFormEntity argument :" + uee);
    					uee.printStackTrace();
    				}
    
    				return null;
    			}
    
    			@Override
    			protected void onPostExecute(String result) {
    				
    				super.onPostExecute(result);
    
    				if(result.equals("working")){
    					
    					Intent intent = new Intent(XXX_LogScreen.this, XXX_MainScreen.class);
    					startActivity(intent);
    					finish();
    				}
    				
    				else{
    						
    					Toast.makeText(getApplicationContext(), "Identification incorrecte !", Toast.LENGTH_LONG).show();
    				}
    			}			
    		}
    
    		SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask();
    		sendPostReqAsyncTask.execute(givenUsername, givenPassword);		
    	}
    }

    La classe hote :

    import com.actionbarsherlock.app.SherlockFragmentActivity;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    
    public class XXX_MainScreen extends SherlockFragmentActivity {
    	
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		
    		super.onCreate(savedInstanceState);
    		
    		setContentView(R.layout.main_screen);		
    	}
    	
    	@Override
    	public void onBackPressed() {
    		
    		Fragment frag_webview = getSupportFragmentManager().findFragmentById(R.id.frag_webview);
    
    	    if (!((XXX_WebViewFragment) frag_webview).onBackPressed()) {
    	    	
    	        super.onBackPressed();
    	    }
    	}
    }
    

    La classe contenant la WebView :

    import java.util.List;
    
    import org.apache.http.cookie.Cookie;
    import org.apache.http.impl.client.DefaultHttpClient;
    
    import com.actionbarsherlock.app.SherlockFragment;
    import com.actionbarsherlock.app.ActionBar;
    import com.actionbarsherlock.app.ActionBar.Tab;
    import com.actionbarsherlock.view.Menu;
    import com.actionbarsherlock.view.MenuItem;
    import com.actionbarsherlock.view.MenuInflater;
    
    import android.annotation.SuppressLint;
    import android.content.Intent;
    import android.support.v4.app.FragmentTransaction;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.webkit.CookieManager;
    import android.webkit.CookieSyncManager;
    import android.webkit.WebBackForwardList;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    
    public class XXX_WebViewFragment extends SherlockFragment implements ActionBar.TabListener {
    			
    	private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item";
    
    	private WebView webView = null;
    	private MenuItem loginItem = null;
    	private WebSettings webSettings = null;
    	private WebViewClient webViewClient = null;
    	private CookieManager cookieManager = null;
    	private com.actionbarsherlock.app.ActionBar actionBar = null;
    	
    	private static DefaultHttpClient myHttpClient = XXX_AppSettings.getClient();
    	
    	private int index;
    	
    	private boolean logged = false;
    	
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		
    		super.onCreate(savedInstanceState);
    	}
    		
    	@Override
    	public void onSaveInstanceState(Bundle outState) {
    		
    	    super.onSaveInstanceState(outState);
    	    
    	    outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getSherlockActivity().getSupportActionBar().getSelectedNavigationIndex());
    
    	    webView.saveState(outState);        
    	}
    		
    	@Override
    	public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    				
    		actionBar = getSherlockActivity().getSupportActionBar();
    		
    		actionBar.setDisplayHomeAsUpEnabled(true);
    		
    		inflater.inflate(R.menu.main_screen_menu, menu);
    				
    		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
    		actionBar.addTab(actionBar.newTab().setIcon(R.drawable.xxxxxxxx).setTabListener(this));
    		actionBar.addTab(actionBar.newTab().setIcon(R.drawable.xxxxxxxx).setTabListener(this));
    		actionBar.addTab(actionBar.newTab().setIcon(R.drawable.xxxxxxxx).setTabListener(this));
    		actionBar.addTab(actionBar.newTab().setIcon(R.drawable.xxxxxxxx).setTabListener(this));
    		actionBar.addTab(actionBar.newTab().setIcon(R.drawable.xxxxxxxx).setTabListener(this));
    		
    		loginItem = menu.findItem(R.id.menu_login);
    					
    		/*if (logCookie_Value.equals("guest")) {
    				
    			loginItem.setIcon(R.drawable.ic_menu_login);
    		}
    			
    		else {
    				
    			loginItem.setIcon(R.drawable.ic_menu_logout);
    		}*/
    	}
    	
    	@Override
    	public boolean onOptionsItemSelected(MenuItem item) {
    								
    		switch (item.getItemId()) {
    		
    			case android.R.id.home:
    
    				actionBar.setSelectedNavigationItem(0);
    				
    				return true;
    
    			case R.id.menu_login:
    									
    				changeWebView(URL);
    				
    				return true;
    				
    			case R.id.menu_refresh:
    
    				changeWebView(URL);
    				
    				return true;
    				
    			case R.id.menu_help:
    				
    				changeWebView(URL);
    				
    				return true;
    	
    			case R.id.menu_settings:
    
    				changeWebView(URL);
    
    				return true;
    				
    			default:
    				
    				return super.onOptionsItemSelected(item);
    		}		
    	}	
    	
    	@Override
    	public void onActivityCreated(Bundle savedInstanceState) {
    		
    		super.onActivityCreated(savedInstanceState);
    	}	
    
    	@Override
    	@SuppressLint("SetJavaScriptEnabled")
    	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    		
    		View view = inflater.inflate(R.layout.webview_fragment, container, false);
    		
    		webView = (WebView) view.findViewById(R.id.webView_wfs);
    		
    		webSettings = webView.getSettings();
    		
    		webSettings.setJavaScriptEnabled(true);
    		webSettings.setGeolocationEnabled(true);
    		webSettings.setLoadWithOverviewMode(true);
    		
    		webViewClient = new WebViewClient() {
    			
    			public void onPageFinished(WebView view, String url) {
    				
    		        CookieSyncManager.getInstance().sync();
    		    }
    		};
    		
    		webView.setWebViewClient(webViewClient);
    		
    		Cookie sessionInfo;
    		
    		List<Cookie> cookies = myHttpClient.getCookieStore().getCookies();
    
    		if (! cookies.isEmpty()) {
    			
    		    CookieSyncManager.createInstance(webView.getContext());
    		    cookieManager = CookieManager.getInstance();
    
    		    for(Cookie cookie : cookies) {
    		    	
    		    	sessionInfo = cookie;
    		        String cookieString = sessionInfo.getName() + "=" + sessionInfo.getValue() + "; domain=" + sessionInfo.getDomain();
    		        cookieManager.setCookie("xxxxxxxx.xxx", cookieString);
    		        CookieSyncManager.getInstance().sync();
    		    }
    		}
    		
    		setHasOptionsMenu(true);
    				
    		return view;
    	}
    	
    	public void changeWebView(String url){
    		
    		webView.loadUrl(url);
    	}
    
    	@Override
    	public void onTabSelected(Tab tab, FragmentTransaction ft) {
    						
    		switch (tab.getPosition() + 1) {
    		
    			case 1:
    
    				changeWebView(URL);
    				index = retrieveCurrentIndex() + 1;
    				
    				break;
    				
    			case 2:
    
    				changeWebView(URL);
    				index = retrieveCurrentIndex() + 1;
    				
    				break;
    								
    			case 3:
    
    				changeWebView(URL);
    				index = retrieveCurrentIndex() + 1;
    				
    				break;
    				
    			case 4:
    					
    				changeWebView(URL);
    				index = retrieveCurrentIndex() + 1;
    				
    				break;
    				
    			case 5:
    
    				changeWebView(URL);
    				index = retrieveCurrentIndex() + 1;
    				
    				break;
    				
    		}		
    	}
    
    	@Override
    	public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    		
    		
    	}
    	
    	@Override
    	public void onTabReselected(Tab tab, FragmentTransaction ft) {
    		
    		
    	}
    	
    	public boolean onBackPressed() {
    		
    		int goBackIndex = retrieveCurrentIndex();
    		
    	    if (webView != null && webView.canGoBack() && goBackIndex > index) {
    	    	
    	        webView.goBack();
    	        
    	        return true;
    	        
    	    } else {
    	    	
    	        return false;
    	    }
    	}
    	
    	private int retrieveCurrentIndex(){
    				
    		WebBackForwardList myWebViewHistory = webView.copyBackForwardList();
    		
    		int cIndex = myWebViewHistory.getCurrentIndex();
    		
    		return cIndex;
    	}
    }

    Et enfin la classe de conf du client http :

    import org.apache.http.conn.ClientConnectionManager;
    import org.apache.http.conn.scheme.PlainSocketFactory;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.scheme.SchemeRegistry;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
    import org.apache.http.params.BasicHttpParams;
    
    import android.app.Application;
    
    public class XXX_AppSettings extends Application{
    
    	private static final DefaultHttpClient client = createClient();
    	
    	@Override
    	public void onCreate(){
    		
    	}
    	
    	static DefaultHttpClient getClient(){
    		
    		return client;
    	}
    	
    	private static DefaultHttpClient createClient(){
    		
    		final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory();
    		
    		BasicHttpParams params = new BasicHttpParams();
    		SchemeRegistry schemeRegistry = new SchemeRegistry();
    		
    		schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    		schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));
    		
    		ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
    		
    		DefaultHttpClient httpclient = new DefaultHttpClient(cm, params);
    		
    		httpclient.getCookieStore().getCookies();
    		
    		return httpclient;
    	}
    }
    

    Les 2 cookies sont bien présents et avec les bonnes valeurs au niveau du logScreen mais une fois passer sur la WebView  c'est comme si ils n'existaient pas et ce malgré la synchronisation.

    Si quelqu'un a une idée, je suis preneur :)

    D'avance merci !





    • Partager sur Facebook
    • Partager sur Twitter

    [Android] WebView, Cookies, prise de tête ...

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown