-2

Hi I am trying to get this android login tutorial to work, but when I enter username and password it says unfortunately app has stopped. Here is my MainActivity:

package com.sencide;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
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.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class AndroidLogin extends Activity implements OnClickListener {

 Button ok,back,exit;
 TextView result;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Login button clicked
        ok = (Button)findViewById(R.id.btn_login);
        ok.setOnClickListener(this);

        result = (TextView)findViewById(R.id.lbl_result);

    }

    public void postLoginData() {
        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();

        /* login.php returns true if username and password is equal to saranga */
        HttpPost httppost = new HttpPost("http://www.sencide.com/blog/login.php");

        try {
            // Add user name and password
         EditText uname = (EditText)findViewById(R.id.txt_username);
         String username = uname.getText().toString();

         EditText pword = (EditText)findViewById(R.id.txt_password);
         String password = pword.getText().toString();

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("username", username));
            nameValuePairs.add(new BasicNameValuePair("password", password));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            Log.w("SENCIDE", "Execute HTTP Post Request");
            HttpResponse response = httpclient.execute(httppost);

            String str = inputStreamToString(response.getEntity().getContent()).toString();
            Log.w("SENCIDE", str);

            if(str.toString().equalsIgnoreCase("true"))
            {
             Log.w("SENCIDE", "TRUE");
             result.setText("Login successful");   
            }else
            {
             Log.w("SENCIDE", "FALSE");
             result.setText(str);             
            }

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

    private StringBuilder inputStreamToString(InputStream is) {
     String line = "";
     StringBuilder total = new StringBuilder();
     // Wrap a BufferedReader around the InputStream
     BufferedReader rd = new BufferedReader(new InputStreamReader(is));
     // Read response until the end
     try {
      while ((line = rd.readLine()) != null) { 
        total.append(line); 
      }
     } catch (IOException e) {
      e.printStackTrace();
     }
     // Return full string
     return total;
    }

    @Override
    public void onClick(View view) {
      if(view == ok){
        postLoginData();
      }
    }

}

Here is my logcat:

07-25 12:26:51.226: D/libEGL(11639): loaded /system/lib/egl/libEGL_mali.so
07-25 12:26:51.226: D/libEGL(11639): loaded /system/lib/egl/libGLESv1_CM_mali.so
07-25 12:26:51.236: D/libEGL(11639): loaded /system/lib/egl/libGLESv2_mali.so
07-25 12:26:51.256: D/OpenGLRenderer(11639): Enabling debug mode 0
07-25 12:27:46.240: W/SENCIDE(11639): Execute HTTP Post Request
07-25 12:27:46.260: D/AndroidRuntime(11639): Shutting down VM
07-25 12:27:46.260: W/dalvikvm(11639): threadid=1: thread exiting with uncaught exception (group=0x40bc0318)
07-25 12:27:46.270: E/AndroidRuntime(11639): FATAL EXCEPTION: main
07-25 12:27:46.270: E/AndroidRuntime(11639): android.os.NetworkOnMainThreadException
07-25 12:27:46.270: E/AndroidRuntime(11639):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1126)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:141)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at com.sencide.AndroidLogin.postLoginData(AndroidLogin.java:70)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at com.sencide.AndroidLogin.onClick(AndroidLogin.java:112)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at android.view.View.performClick(View.java:4103)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at android.view.View$PerformClick.run(View.java:17117)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at android.os.Handler.handleCallback(Handler.java:615)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at android.os.Looper.loop(Looper.java:137)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at android.app.ActivityThread.main(ActivityThread.java:4744)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at java.lang.reflect.Method.invokeNative(Native Method)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at java.lang.reflect.Method.invoke(Method.java:511)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-25 12:27:46.270: E/AndroidRuntime(11639):    at dalvik.system.NativeStart.main(Native Method)

If anyone can help me I appreciate it as I'm having a lot of trouble trying to figure out how to get an android login app working. If anyone has any other tutorials or apps working to login to an sql server with web services I'd appreciate the direction cause that is more what I want to do.

stack16
  • 7
  • 4

1 Answers1

0

Your code seems generally correct in principle, the error you're getting is because, especially on newer android versions, its a big no-no to handle these Network connections on the main thread. What you want to do is set up an AsyncTask to handle these requests so that the application doesn't have to hang there, which is whats causing your timeout.

Edit to address your comment:

That would likely do the trick. Or, to make things a little bit easier, you could simply create a new AsyncTask as your first line in postLoginData, something like

 new AsyncTask<String, Void, String>() {
 @Override
    postLoginData(Void... params).

After that, you should be able to handle your HTTP requests normally. As a closing thought, in some cases, i've found that although it sort of ignores the real issue, you could include lines like

StrictMode.ThreadPolicy mypolicy = 
new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(mypolicy);

immediately inside of your postLoginData method. In some cases i've found that this can get rid of those errors. Finally, don't forget to add ACCESS_NETWORK_STATE permission to your android manifest!

Dan
  • 212
  • 1
  • 6
  • 12