2016-04-20 9 views
0

Я пытаюсь сделать работу с кнопкой входа, моя цель: отправить веб-запрос на сервер с именем пользователя и паролем (в md5), получить ответ с сервера (ответ находится в xml), сохранить ответ на файл или что-то еще и использовать его для следующих запросов. Мой код похож на этот:Кнопка входа в приложение android, правильное согласование с сервером

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

Моя проблема, как представляется, в AsyncTask. Веб-ответ будет иметь токен, который я должен использовать для дальнейших запросов. Я получаю это:

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) 

У меня есть это в манифесте:

<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

вы можете использовать залп и передать этот пример: https: // www.simplifiedcoding.net/android-login-example-using-php-mysql-and-volley/ –

ответ

0

Во-первых, вам не нужен маркер от сервера передать обратно для дальнейших запросов. Для этого будет достаточно идентификатора пользователя. Сервер может проверить, есть ли подходящий сеанс для этого пользователя, точно так же, как он проверяет правильность токена.

Теперь ваша проблема может заключаться в том, где хранить информацию, будь то идентификатор пользователя или токен, в вашем приложении, чтобы она была доступна для дальнейших запросов. Если это то, что вы хотите знать, проверьте мой ответ на How to: Keep track of Progress on questionnaire.

(Рецензенты: Пожалуйста, не помечайте этот вопрос как дубликат (пока), так как это не ясно, что является ли ядро ​​вопроса.)