2016-04-20 12 views
0

Ich versuche, einen Login-Button arbeiten, ist mein Ziel zu: Web-Anfrage an den Server mit Benutzername und Passwort senden (in MD5), erhalten die Antwort vom Server (Die Antwort ist in XML), speichern Sie die Antwort auf eine Datei oder etwas und verwenden Sie sie für die nächsten Anfragen. Mein Code ist ähnlich wie folgt aus:Login-Taste in Android-Anwendung, richtige Kommunikation mit Server

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); 
     }*/ 
} 

Mein Problem erscheint in der AsyncTask zu sein. Die Web-Antwort wird ein Token haben, das ich für weitere Anfragen verwenden muss. Ich bekomme diese:

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) 

Ich habe diese im Manifest:

<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

können Sie Volley verwenden und dieses Beispiel verweisen: https: // www.simplifiedcoding.net/android-login-example-using-php-mysql-and-volley/ –

Antwort

0

Erstens brauchen Sie nicht einen Token vom Server für weitere Anfragen zurücklaufen. Die Benutzer-ID wird dafür ausreichen. Der Server kann prüfen, ob es für diesen Benutzer eine richtige Sitzung gibt, genauso wie er die Gültigkeit des Tokens überprüfen würde.

Ihr Problem könnte jetzt sein, wo die Informationen, ob Benutzer-ID oder Token, in Ihrer App gespeichert werden, damit sie für weitere Anfragen verfügbar sind. Wenn Sie das wissen möchten, überprüfen Sie meine Antwort auf How to: Keep track of Progress on questionnaire.

(Referenten: Bitte nicht Flagge, diese Frage als Duplikat (noch) nicht, da nicht klar ist, ob das ist der Kern der Frage.)