2016-04-20 2 views
0

J'essaie de faire un bouton de connexion, mon but est de: envoyer une requête Web au serveur avec nom d'utilisateur et mot de passe (en MD5), recevoir la réponse du serveur (la réponse est en XML), enregistrer la réponse à un fichier ou quelque chose et l'utiliser pour les demandes suivantes. Mon code est similaire à ceci:Bouton de connexion dans l'application android, comunciation correcte avec le serveur

Button login_button = (Button) findViewById(R.id.button_login); 
if (login_button != null) { 
login_button.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
EditText username_text =(EditText)findViewById(R.id.username); 
String username_string = username_text.getText().toString(); 
EditText password_text = (EditText) findViewById(R.id.password); 
String password_string = password_text.getText().toString(); 
String md5_pass=MD5.crypt(password_string); // MD5 is a class that encrpts in md5        
//File tempFile = new File(Envoirment,"tempFile"); 
new JSONTask().execute("http://site/Security.php?function=login&user=\" + username_string + \"&hash=\" + md5_pass"); 
       } 
     }); 
    } 
public class JSONTask extends AsyncTask<String,String,String> 
{ 
    @Override 
    protected String doInBackground(String... params) { 
     HttpURLConnection connection = null; 
     BufferedReader reader = null; 
     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 
      InputStream stream = connection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(stream)); 
      String line; 
      StringBuffer buffer = new StringBuffer(); 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 
      return buffer.toString(); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 
       connection.disconnect(); 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 
    @Override 
    protected void onPostExecute(String result) {        
     super.onPostExecute(result); 
     Intent i = new Intent(Login.this, MainActivity.class); 
     startActivity(i); 
     try { 
      BufferedWriter writer = new BufferedWriter(new FileWriter(".\\tempFile")); 
      //writer.write(); i don't know how 
      writer.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
     /*else { 
      Intent i = new Intent(LoginActivity.this, RegisterActivity.class); 
      startActivity(i); 
     }*/ 
} 

Mon problème semble être dans le AsyncTask. La réponse Web aura un jeton que je devrai utiliser pour d'autres demandes. Je reçois ceci:

Process: try.app, PID: 17322 
                 java.lang.RuntimeException: An error occured while executing doInBackground() 
                  at android.os.AsyncTask$3.done(AsyncTask.java:300) 
                  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
                  at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
                  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                  at java.lang.Thread.run(Thread.java:841) 
                 Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?) 
                  at java.net.InetAddress.lookupHostByName(InetAddress.java:464) 
                  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:251) 
                  at java.net.InetAddress.getAllByName(InetAddress.java:229) 
                  at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28) 
                  at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216) 
                  at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122) 
                  at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292) 
                  at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 
                  at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 
                  at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 
                  at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89) 
                  at try.app.Login$JSONTask.doInBackground(Login.java:67) 
                  at try.app.Login$JSONTask.doInBackground(Login.java:57) 
                  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
                  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
                  at java.lang.Thread.run(Thread.java:841)  
                 Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname) 
                  at libcore.io.Posix.getaddrinfo(Native Method) 
                  at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61) 
                  at java.net.InetAddress.lookupHostByName(InetAddress.java:451) 
                  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:251)  
                  at java.net.InetAddress.getAllByName(InetAddress.java:229)  
                  at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)  
                  at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)  
                  at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)  
                  at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)  
                  at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)  
                  at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)  
                  at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)  
                  at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)  
                  at try.app.Login$JSONTask.doInBackground(Login.java:67)  
                  try.app.Login$JSONTask.doInBackground(Login.java:57)  
                  at android.os.AsyncTask$2.call(AsyncTask.java:288)  
                  at java.util.concurrent.FutureTask.run(FutureTask.java:237)  
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
                  at java.lang.Thread.run(Thread.java:841)  
                 Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied) 

Je ces dans le manifeste:

<uses-permission android:name="android.permissions.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
+0

vous pouvez utiliser volley et consulter cet exemple: https: // www.simplifiedcoding.net/android-login-example-using-php-mysql-and-volley/ –

Répondre

0

D'abord, vous n'avez pas besoin d'un jeton du serveur pour passer de retour pour de nouvelles demandes. L'identifiant de l'utilisateur sera suffisant pour cela. Le serveur peut vérifier s'il existe une session appropriée pour cet utilisateur, tout comme il vérifie la validité du jeton. Maintenant, votre problème pourrait être de savoir où stocker les informations, que ce soit un identifiant d'utilisateur ou un jeton, dans votre application afin qu'elles soient disponibles pour d'autres demandes. Si c'est ce que vous voulez savoir, vérifiez ma réponse à How to: Keep track of Progress on questionnaire.

(chroniqueurs: S'il vous plaît ne pas signaler cette question comme un doublon (encore), car il ne sait pas si c'est le cœur de la question.)