Autore Topic: Login e Sessione Utente  (Letto 872 volte)

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Login e Sessione Utente
« il: 23 Aprile 2015, 11:18:54 CEST »
0
Salve,
sto sviluppando un'applicazione che prevede una login presso un server Remoto.
Lo schema è quello mostrato nell'immagine in allegato.
Ho però due problemi che non riesco a sorvolare :
1) Dopo aver mandato la richiesta al server, con l'async task, ho dovuto inserire un Thread.sleep prima della lettura dei dati di risposta dal server altrimenti l'applicazione mi crashava. Non c'è un modo diverso per gestire tutto ciò ?
Vi posto il codice così risulterà più chiaro cosa ho fatto:

-Classe di Login in cui ho inserito il thread.sleep
Codice (Java): [Seleziona]
public class LoginFragment extends Fragment {
       
        EditText inputEmail;
        EditText inputPassword;
        Button btnLogin;
        Button btnLinkToRegister;
        TextView loginErrorMsg;
        JSONObject json = null;
         View rootView;

        // JSON : Nomi dei nomi di risposta
        private static String KEY_SUCCESS = "success";
                private static String KEY_UID = "uid";
        private static String KEY_NAME = "name";
        private static String KEY_EMAIL = "email";
               
        public LoginFragment(){}
       

       
        @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 
        rootView = inflater.inflate(R.layout.fragment_login, container, false);        
       
        return rootView;
    }
       
       
       
        @Override
        public void onActivityCreated(Bundle savedInstanceState)    
        {
          super.onActivityCreated(savedInstanceState);
       
       
          // Importing all assets like buttons, text fields
   
        inputEmail = (EditText) rootView.findViewById(R.id.loginEmail);
                inputPassword = (EditText) rootView.findViewById(R.id.loginPassword);
                btnLogin = (Button) rootView.findViewById(R.id.btnLogin);
                btnLinkToRegister = (Button) rootView.findViewById(R.id.btnLinkToRegisterScreen);
                loginErrorMsg = (TextView) rootView.findViewById(R.id.login_error);
               
        // Login button Click Event
        btnLogin.setOnClickListener(new View.OnClickListener()
        {
                public void onClick(View view)
                {                      
                        ((MainActivity) getActivity()).updateDrawer();
                       
                        String email = inputEmail.getText().toString();
                        String password = inputPassword.getText().toString();
                        UserFunctions userFunction = new UserFunctions();
                        Log.d("Button", "Login");
                       
                       
//                      //Cambio nome nel menu
//                      Costanti.navDrawerItems.get(3).setTitle("Logout");
                       
                        userFunction.loginUser(email, password);
                        try {
                                Thread.sleep(500);
                        } catch (InterruptedException e2) {
                                e2.printStackTrace();
                        }
                        json = SingletonClass.getSingletonIstance().getJson();
                       
                        // check for login response
                        try {
                               
                                if (json.getString(KEY_SUCCESS) != null)
                                {
                                        loginErrorMsg.setText("");
                                       
                                        /*Se il JSON restituisce 1 allora il login è andato a buon fine*/
                                        String res = json.getString(KEY_SUCCESS);
                                        if(Integer.parseInt(res) == 1)
                                        {
                                                // user successfully logged in
                                                // Store user details in SQLite Database
                                                DatabaseHandler db = new DatabaseHandler(getActivity());
                                                JSONObject json_user = json.getJSONObject("user");
                                               
                                                // Clear all previous data in database
                                                userFunction.logoutUser(getActivity());
                                                String nome = json_user.getString(KEY_NAME);
                                                String cognome = json_user.getString(KEY_EMAIL);
                                                String ID = json.getString(KEY_UID);
                                                db.addUser(nome,cognome , ID);         
                                               
                                                /*Creao l'unica istanza di accesso ai parametri dell'utente*/
                                                SingletonClass.getSingletonIstance().setNome(nome);
                                                SingletonClass.getSingletonIstance().setCognome(cognome);
                                                SingletonClass.getSingletonIstance().setID_U(ID);                                                                                                                                                      

                                               
                                                DTCFragment fragment2 = new DTCFragment();
                            FragmentManager fragmentManager = getFragmentManager();
                                fragmentManager.beginTransaction().replace(R.id.frame_container, fragment2).commit();
                                               
//                                              getActivity().startActivity(new Intent(getActivity(),BluetoothChat.class));
                                               
                                               
                                                // Close Login Screen
                                                //finish();
                                        }else{ //Se json restituisce 2 allora l'utente è già presente nel DB
                                                // Error in login
                                                loginErrorMsg.setText("Incorrect username/password");
                                        }
                                }
                               
                                else {
                                        Toast.makeText(getActivity(), "Json Null", Toast.LENGTH_LONG).show();
                                }
                        } catch (JSONException e)
                        {
                                e.printStackTrace();
                        }
                }
        });
       
        // Link to Register Screen
        btnLinkToRegister.setOnClickListener(new View.OnClickListener()
        {
                public void onClick(View view)
                {
                        RegisterFragment fragment2 = new RegisterFragment();
            FragmentManager fragmentManager = getFragmentManager();
                fragmentManager.beginTransaction().replace(R.id.frame_container, fragment2).commit();
                       
               
               
                }
        });
        }
}
- Formulazione della Richiesta
Codice (Java): [Seleziona]
public class UserFunctions
{
       
        private JSONParser jsonParser;
       
        private static String serverURL = "http://10.6.72.104/android_login_api/index.php";
       
        private static String login_tag = "login";
        private static String register_tag = "register";
        private static String trip_tag = "registerTrip";
        private static String trip_request = "requestTrip";
        private static String DTC_tag = "store_DTC";
        private static String DTC_request = "request_DTC";
       
       
        JSONObject json=null;
       
        // constructor
        public UserFunctions()
        {      
                jsonParser = new JSONParser();
        }
       
        /**
         * function make Login Request
         * @param email
         * @param password
         * */

        /*Costruzione della richiesta JSON per il login
         * Esempio di richiesta : [tag=login, email=raffa, password=raffa]
         * */

        public void loginUser(String email, String password)
        {
                String[] parametri = {"tag",login_tag,"email",email,"password",password};
               
                AddStringTask connection = new AddStringTask();
                connection.execute(parametri);
               
        }
       
   .....
/*=========================== ASINCTASK==============================*/
        class AddStringTask extends AsyncTask<String, Void, JSONObject> {
                @Override
                protected void onPostExecute(JSONObject js)
                {
                        //Scrivo la variabile JSON
                        SingletonClass.getSingletonIstance().setJson(js);
                }

                @Override
                protected JSONObject doInBackground(String... params) {
                        // TODO Auto-generated method stub
                        List<NameValuePair> lista = new ArrayList<NameValuePair>();
                        ArrayList<String> app = new ArrayList<String>();
                        int j=0;
                        for(String i:params){
                                app.add(i);
                                j++;
                        }
                        for(int i=0;i<app.size();){
                                                lista.add(new BasicNameValuePair(app.get(i),app.get(i+1)));
                                                System.out.println("nome : "+app.get(i)+" Value : "+app.get(i+1));
                                                i=i+2;
                        }
                       
                               
                        json = jsonParser.getJSONFromUrl(serverURL, lista);
                        return (json);
                }              
        }      

       


-Codice di Richiesta dati al Server
Codice (Java): [Seleziona]
public class JSONParser {

        static InputStream is = null;
        JSONObject jObj = null;
        static String json = "";

        // constructor
        public JSONParser() {}

        /*Funzione per il recupero dei dati*/
        public JSONObject getJSONFromUrl(String url, List<NameValuePair> parametri)
        {
                // Making HTTP request
                try {
                        // defaultHttpClient
                        // Inizializzazione della connessione HTTP
                        DefaultHttpClient httpClient = new DefaultHttpClient();
                        HttpPost httpPost = new HttpPost(url);
                        httpPost.setEntity(new UrlEncodedFormEntity(parametri));

                        HttpResponse httpResponse = httpClient.execute(httpPost);
                        HttpEntity httpEntity = httpResponse.getEntity();
                       
                        is = httpEntity.getContent();

                } catch (UnsupportedEncodingException e)
                {
                        e.printStackTrace();
                } catch (ClientProtocolException e)
                {
                        e.printStackTrace();
                } catch (IOException e)
                {
                        e.printStackTrace();
                }

                try {
                        /*Mi metto in ascolto sulla connessione HTTP e letto tutti i dati memorizzandoli nel buffer SB.
                        Dopo aver letto tutti i dati li memorizzo nella variabile - json - */

                        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null)
                        {
                                sb.append(line + "\n");
                        }
                        is.close();
                        json = sb.toString();
                       
                } catch (Exception e)
                {
                        Log.e("Buffer Error", "Error converting result " + e.toString());
                }
                // try parse the string to a JSON object
                try {
                        /*Creo un oggetto JSON contenenre le stringhe appena lette*/
                        jObj = new JSONObject(json);   
                        SingletonClass.getSingletonIstance().setJson(jObj);
                       
                } catch (JSONException e)
                {
                        Log.e("JSON Parser", "Error parsing data " + e.toString());
                }

                // return JSON String
                /*Restituisco i dati appena letti in formato JSON*/
                return jObj;

        }
}


2) Il secondo problema consiste nella gestione della sessione utente.
In pratica ogni volta che chiudo l'applicazione perdo i dati di login e quindi l'utente è costretto a rieffettuare il login. Come potrei ovviare a questo problema?


Grazie in anticipo per l'aiuto.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1186
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Login e Sessione Utente
« Risposta #1 il: 23 Aprile 2015, 12:17:37 CEST »
0
Al volo...per il secondo problema potresti salvarti i dati del login nelle shared preferences.
Per il primo problema mi pare strano che devi mettere il .sleep(). Che errore genera se lo togli? Inoltre i vari settaggi delle TextView ect andrebbero fatti in OnCreateView

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:Login e Sessione Utente
« Risposta #2 il: 23 Aprile 2015, 12:34:56 CEST »
0
Ciao Tonno16,
grazie per la risposta.

Questo è il log dell'app quando non inserisco il Thread.sleep :
Codice (Java): [Seleziona]
04-23 12:33:45.816: E/AndroidRuntime(5388): FATAL EXCEPTION: main
04-23 12:33:45.816: E/AndroidRuntime(5388): Process: info.androidhive.slidingmenu, PID: 5388
04-23 12:33:45.816: E/AndroidRuntime(5388): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.getString(java.lang.String)' on a null object reference
04-23 12:33:45.816: E/AndroidRuntime(5388):     at info.androidhive.slidingmenu.LoginFragment$1.onClick(LoginFragment.java:126)
04-23 12:33:45.816: E/AndroidRuntime(5388):     at android.view.View.performClick(View.java:4763)
04-23 12:33:45.816: E/AndroidRuntime(5388):     at android.view.View$PerformClick.run(View.java:19821)
04-23 12:33:45.816: E/AndroidRuntime(5388):     at android.os.Handler.handleCallback(Handler.java:739)
04-23 12:33:45.816: E/AndroidRuntime(5388):     at android.os.Handler.dispatchMessage(Handler.java:95)
04-23 12:33:45.816: E/AndroidRuntime(5388):     at android.os.Looper.loop(Looper.java:135)
04-23 12:33:45.816: E/AndroidRuntime(5388):     at android.app.ActivityThread.main(ActivityThread.java:5274)
04-23 12:33:45.816: E/AndroidRuntime(5388):     at java.lang.reflect.Method.invoke(Native Method)
04-23 12:33:45.816: E/AndroidRuntime(5388):     at java.lang.reflect.Method.invoke(Method.java:372)
04-23 12:33:45.816: E/AndroidRuntime(5388):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
04-23 12:33:45.816: E/AndroidRuntime(5388):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)

Per quanto riguarda la sessione utente ora guardo la shared preference , Grazie:D

Offline tonno16

  • Utente storico
  • *****
  • Post: 1186
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Login e Sessione Utente
« Risposta #3 il: 23 Aprile 2015, 12:36:49 CEST »
0
metti onCreateView

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:Login e Sessione Utente
« Risposta #4 il: 23 Aprile 2015, 12:39:06 CEST »
0
Mi suggerisci di mettere tutto in onCreateView()?

Post unito: 23 Aprile 2015, 14:32:26 CEST
Ciao Tonno 16,
ho provato ad implementare la "shared Preference" ho perà un problema.
Nella mia app sto usando i FRAGMENT in quanto sto gestendo una NAVIGATION DRAWER.
Nell'implementazione del SESSION MANAGER dello Shared Preference ad un certo punto dovrei inserire una intent  in quanto se non sono loggata deve visualizzare la view di login.

Codice (Java): [Seleziona]
        public void checkLogin(){
                // Check login status
                if(!this.isLoggedIn()){
                        // user is not logged in redirect him to Login Activity
                        /**************************************
                         * ***********************************
                         * ***********************************
                         */

                        Intent i = new Intent(_context, LoginFragment.class);
                        // Closing all the Activities
                        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                       
                        // Add new Flag to start new Activity
                        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                       
                        // Staring Login Activity
                        _context.startActivity(i);
                       
                       
                }
               

Il problema è che l'intent non va. Di seguito ti posto il logcat


Codice: [Seleziona]
04-23 14:31:56.119: E/AndroidRuntime(14639): FATAL EXCEPTION: main
04-23 14:31:56.119: E/AndroidRuntime(14639): Process: info.androidhive.slidingmenu, PID: 14639
04-23 14:31:56.119: E/AndroidRuntime(14639): java.lang.RuntimeException: Unable to start activity ComponentInfo{info.androidhive.slidingmenu/info.androidhive.slidingmenu.MainActivity}: android.content.ActivityNotFoundException: Unable to find explicit activity class {info.androidhive.slidingmenu/info.androidhive.slidingmenu.LoginFragment}; have you declared this activity in your AndroidManifest.xml?
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2367)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.ActivityThread.access$800(ActivityThread.java:148)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.os.Handler.dispatchMessage(Handler.java:102)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.os.Looper.loop(Looper.java:135)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.ActivityThread.main(ActivityThread.java:5274)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at java.lang.reflect.Method.invoke(Native Method)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at java.lang.reflect.Method.invoke(Method.java:372)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
04-23 14:31:56.119: E/AndroidRuntime(14639): Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {info.androidhive.slidingmenu/info.androidhive.slidingmenu.LoginFragment}; have you declared this activity in your AndroidManifest.xml?
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1761)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.Instrumentation.execStartActivity(Instrumentation.java:1485)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.ContextImpl.startActivity(ContextImpl.java:1308)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.ContextImpl.startActivity(ContextImpl.java:1290)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.content.ContextWrapper.startActivity(ContextWrapper.java:322)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at it.reply.Sessione.SessionManager.checkLogin(SessionManager.java:88)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at info.androidhive.slidingmenu.DashboardFragment.onCreateView(DashboardFragment.java:83)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.Fragment.performCreateView(Fragment.java:2062)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.BackStackRecord.run(BackStackRecord.java:833)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.Activity.performStart(Activity.java:5992)
04-23 14:31:56.119: E/AndroidRuntime(14639):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268)
04-23 14:31:56.119: E/AndroidRuntime(14639):         ... 10 more
« Ultima modifica: 23 Aprile 2015, 14:32:26 CEST da Raffyna, Reason: Merged DoublePost »

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Login e Sessione Utente
« Risposta #5 il: 23 Aprile 2015, 15:01:41 CEST »
0
Non trova la classe LoginFragment.class, l'hai dichiarata nel AndroidManifest come activity?

Edit:
Ma come gestisci la sessione?
Sul server remoto risulto sempre attivo anche se l'app è chiusa e non va mai in "timeout"?
Se così non è, per l'app potresti risultare online anche se sul server in realtà non lo sei.
« Ultima modifica: 23 Aprile 2015, 15:05:30 CEST da LonelyWolf »
Se la mia risposta ti è utile, per favore un thanks!

Offline tonno16

  • Utente storico
  • *****
  • Post: 1186
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Login e Sessione Utente
« Risposta #6 il: 23 Aprile 2015, 15:03:21 CEST »
0
LoginFragment non va dichiarato da nessuna parte. È un fragment.

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Login e Sessione Utente
« Risposta #7 il: 23 Aprile 2015, 15:09:17 CEST »
0
Visto che la avvia con startActivity per me è una fragment activity e di conseguenza deve essere dichiarata.
Se la mia risposta ti è utile, per favore un thanks!

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:Login e Sessione Utente
« Risposta #8 il: 23 Aprile 2015, 15:16:46 CEST »
0
Ciao LonelyWolf,
come diceva Tonno16 Login è un Fragment per questo non l'ho dichiarata nel manifest.
Chiedevo se potessi sostituire la intent , che si riferisce ad un'activity, con altre istruzioni che consentono di attivare il fragment.

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Login e Sessione Utente
« Risposta #9 il: 23 Aprile 2015, 18:30:38 CEST »
0
Per questo allora devi usare il fragmentmanager che carica il fragment che ti serve.
Se la mia risposta ti è utile, per favore un thanks!

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Login e Sessione Utente
« Risposta #10 il: 28 Aprile 2015, 11:57:07 CEST »
0
Risolto?
Se la mia risposta ti è utile, per favore un thanks!

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:Login e Sessione Utente
« Risposta #11 il: 30 Aprile 2015, 14:11:30 CEST »
0
Ciao Lonely,
sisi ho risolto :D.

Ora però ho una domanda relativa al Login e all'async Task, vorrei "bloccare" momentaneamente la sequenza di istruzioni di una classe fino a quando un'altra classe non ha finito di fare determinate operazioni.
Mi spiego meglio :
vorrei stoppare l'avanzata del login fino a quando l'asynctask che comunica con il server non riceve una risposta dal server.
Per fare questo dovrei usare una WAIT? Oppure potrei fare in modo diverso ?

Grazie.
A presto.