package com.php.ui;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
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 org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;import com.php.Json2Lv;
import com.php.R;public class Login extends Activity { private String userName;
private String password;
String strResult; /** 以下是UI */
private EditText view_userName;
private EditText view_password;
private CheckBox view_rememberMe;
private Button view_loginSubmit;
private Button view_loginRegister;
private TextView textView1;
private static final int MENU_EXIT = Menu.FIRST - 1;
private static final int MENU_ABOUT = Menu.FIRST;
/** 用来操作SharePreferences的标识 */
private final String SHARE_LOGIN_TAG = "MAP_SHARE_LOGIN_TAG"; /** 如果登录成功后,用于保存用户名到SharedPreferences,以便下次不再输入 */
private String SHARE_LOGIN_USERNAME = "MAP_LOGIN_USERNAME"; /** 如果登录成功后,用于保存PASSWORD到SharedPreferences,以便下次不再输入 */
private String SHARE_LOGIN_PASSWORD = "MAP_LOGIN_PASSWORD"; /** 如果登陆失败,这个可以给用户确切的消息显示,true是网络连接失败,false是用户名和密码错误 */
private boolean isNetError; /** 登录loading提示框 */
private ProgressDialog proDialog; /** 登录后台通知更新UI线程,主要用于登录失败,通知UI线程更新界面 */
Handler loginHandler = new Handler() {
public void handleMessage(Message msg) {
isNetError = msg.getData().getBoolean("isNetError");
if (proDialog != null) {
proDialog.dismiss();
}
if (isNetError) {
Toast.makeText(Login.this, "登陆失败:\n1.请检查您网络连接.\n2.请联系我们.!",
Toast.LENGTH_SHORT).show();
}
// 用户名和密码错误
else {
Toast.makeText(Login.this, "登陆失败,请输入正确的用户名和密码!",
Toast.LENGTH_SHORT).show();
// 清除以前的SharePreferences密码
clearSharePassword();
}
}
}; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
findViewsById();
initView(false);
// 需要去submitListener里面设置URL
setListener();
} /** 初始化注册View组件 */
private void findViewsById() {
view_userName = (EditText) findViewById(R.id.loginUserNameEdit);
view_password = (EditText) findViewById(R.id.loginPasswordEdit);
view_rememberMe = (CheckBox) findViewById(R.id.loginRememberMeCheckBox);
view_loginSubmit = (Button) findViewById(R.id.loginSubmit);
//view_loginRegister = (Button) findViewById(R.id.loginRegister);
} /**
* 初始化界面
*
* @param isRememberMe
* 如果当时点击了RememberMe,并且登陆成功过一次,则saveSharePreferences(true,ture)后,则直接进入
* */
private void initView(boolean isRememberMe) {
SharedPreferences share = getSharedPreferences(SHARE_LOGIN_TAG, 0);
String userName = share.getString(SHARE_LOGIN_USERNAME, "");
String password = share.getString(SHARE_LOGIN_PASSWORD, "");
Log
.d(this.toString(), "userName=" + userName + " password="
+ password);
if (!"".equals(userName)) {
view_userName.setText(userName);
}
if (!"".equals(password)) {
view_password.setText(password);
view_rememberMe.setChecked(true);
}
// 如果密码也保存了,则直接让登陆按钮获取焦点
if (view_password.getText().toString().length() > 0) {
// view_loginSubmit.requestFocus();
// view_password.requestFocus();
}
share = null;
} /**
* 检查用户登陆,服务器通过DataOutputStream的dos.writeInt(int);来判断是否登录成功(
* 服务器返回int>0登陆成功,否则失败),登陆成功后根据isRememberMe来判断是否保留密码(用户名是会保留的),
* 如果连接服务器超过5秒,也算连接失败.
*
* @param userName
* 用户名
* @param password
* 密码
* @param validateUrl
* 检查登陆的地址
* */
private boolean validateLocalLogin(String userName, String password,
String validateUrl) {
System.out.println("username:"+userName);
System.out.println("password:"+password);
// 用于标记登陆状态
boolean loginState = false; HttpPost httpRequest =new HttpPost(validateUrl);
//Post运作传送变数必须用NameValuePair[]阵列储存 //传参数 服务端获取的方法为request.getParameter("name") List params=new ArrayList();
params.add(new BasicNameValuePair("Username",userName));
params.add(new BasicNameValuePair("Pwd",password));
try{ //发出HTTP request httpRequest.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8)); //取得HTTP response
HttpResponse httpResponse=new DefaultHttpClient().execute(httpRequest);
//若状态码为200 ok if(httpResponse.getStatusLine().getStatusCode()==200){
//取出回应字串 strResult=EntityUtils.toString(httpResponse.getEntity());
System.out.println("strResult: "+strResult);
}
}catch(Exception e){
e.printStackTrace();} if(strResult.equals("<script>window.location.href='index.php'</script>")){
loginState = true;
}
// 登陆成功
if (loginState) {
if (isRememberMe()) {
saveSharePreferences(true, true);
} else {
saveSharePreferences(true, false);
}
} else {
// 如果不是网络错误
if (!isNetError) {
clearSharePassword();
}
}
if (!view_rememberMe.isChecked()) {
clearSharePassword();
}
return loginState;
} /**
* 如果登录成功过,则将登陆用户名和密码记录在SharePreferences
*
* @param saveUserName
* 是否将用户名保存到SharePreferences
* @param savePassword
* 是否将密码保存到SharePreferences
* */
private void saveSharePreferences(boolean saveUserName, boolean savePassword) {
SharedPreferences share = getSharedPreferences(SHARE_LOGIN_TAG, 0);
if (saveUserName) {
Log.d(this.toString(), "saveUserName="
+ view_userName.getText().toString());
share.edit().putString(SHARE_LOGIN_USERNAME,
view_userName.getText().toString()).commit();
}
if (savePassword) {
share.edit().putString(SHARE_LOGIN_PASSWORD,
view_password.getText().toString()).commit();
}
share = null;
} /** 记住我的选项是否勾选 */
private boolean isRememberMe() {
if (view_rememberMe.isChecked()) {
return true;
}
return false;
} /** 登录Button Listener */
private OnClickListener submitListener = new OnClickListener() {
@Override
public void onClick(View v) {
proDialog = ProgressDialog.show(Login.this, "连接中..",
"连接中..请稍后....", true, true);
// 开一个线程进行登录验证,主要是用于失败,成功可以直接通过startAcitivity(Intent)转向
Thread loginThread = new Thread(new LoginFailureHandler());
loginThread.start();
}
}; /** 记住我checkBoxListener */
private OnCheckedChangeListener rememberMeListener = new OnCheckedChangeListener() { @Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (view_rememberMe.isChecked()) {
Toast.makeText(Login.this, "如果登录成功,以后账号和密码会自动输入!",
Toast.LENGTH_SHORT).show();
}
}
}; /** 注册Listener */
private OnClickListener registerLstener = new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(Login.this, Register.class);
// 转向注册页面
startActivity(intent);
}
}; /** 设置监听器 */
private void setListener() {
view_loginSubmit.setOnClickListener(submitListener);
view_loginRegister.setOnClickListener(registerLstener);
view_rememberMe.setOnCheckedChangeListener(rememberMeListener);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, MENU_EXIT, 0, getResources().getText(R.string.MENU_EXIT));
menu.add(0, MENU_ABOUT, 0, getResources().getText(R.string.MENU_ABOUT));
return true;
} @Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
super.onMenuItemSelected(featureId, item);
switch (item.getItemId()) {
case MENU_EXIT:
finish();
break;
case MENU_ABOUT:
alertAbout();
break;
}
return true;
} /** 弹出关于对话框 */
private void alertAbout() {
new AlertDialog.Builder(Login.this).setTitle(R.string.MENU_ABOUT)
.setMessage(R.string.aboutInfo).setPositiveButton(
R.string.ok_label,
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialoginterface, int i) {
}
}).show();
} /** 清除密码 */
private void clearSharePassword() {
SharedPreferences share = getSharedPreferences(SHARE_LOGIN_TAG, 0);
share.edit().putString(SHARE_LOGIN_PASSWORD, "").commit();
share = null;
} class LoginFailureHandler implements Runnable {
@Override
public void run() {
userName = view_userName.getText().toString();
password = view_password.getText().toString();
//这里换成你的验证地址
String validateURL="http://10.0.2.2/jqueryRegister02/login.php";
boolean loginState = validateLocalLogin(userName, password,
validateURL);
Log.d(this.toString(), "validateLogin"); // 登陆成功
if (loginState) {
// 需要传输数据到登陆后的界面,
Intent intent = new Intent();
intent.setClass(Login.this, Json2Lv.class);
Bundle bundle = new Bundle();
bundle.putString("MAP_USERNAME", userName);
intent.putExtras(bundle);
// 转向登陆后的页面
startActivity(intent);
proDialog.dismiss();
} else {
// 通过调用handler来通知UI主线程更新UI,
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putBoolean("isNetError", isNetError);
message.setData(bundle);
loginHandler.sendMessage(message);
}
} }
}
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
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 org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;import com.php.Json2Lv;
import com.php.R;public class Login extends Activity { private String userName;
private String password;
String strResult; /** 以下是UI */
private EditText view_userName;
private EditText view_password;
private CheckBox view_rememberMe;
private Button view_loginSubmit;
private Button view_loginRegister;
private TextView textView1;
private static final int MENU_EXIT = Menu.FIRST - 1;
private static final int MENU_ABOUT = Menu.FIRST;
/** 用来操作SharePreferences的标识 */
private final String SHARE_LOGIN_TAG = "MAP_SHARE_LOGIN_TAG"; /** 如果登录成功后,用于保存用户名到SharedPreferences,以便下次不再输入 */
private String SHARE_LOGIN_USERNAME = "MAP_LOGIN_USERNAME"; /** 如果登录成功后,用于保存PASSWORD到SharedPreferences,以便下次不再输入 */
private String SHARE_LOGIN_PASSWORD = "MAP_LOGIN_PASSWORD"; /** 如果登陆失败,这个可以给用户确切的消息显示,true是网络连接失败,false是用户名和密码错误 */
private boolean isNetError; /** 登录loading提示框 */
private ProgressDialog proDialog; /** 登录后台通知更新UI线程,主要用于登录失败,通知UI线程更新界面 */
Handler loginHandler = new Handler() {
public void handleMessage(Message msg) {
isNetError = msg.getData().getBoolean("isNetError");
if (proDialog != null) {
proDialog.dismiss();
}
if (isNetError) {
Toast.makeText(Login.this, "登陆失败:\n1.请检查您网络连接.\n2.请联系我们.!",
Toast.LENGTH_SHORT).show();
}
// 用户名和密码错误
else {
Toast.makeText(Login.this, "登陆失败,请输入正确的用户名和密码!",
Toast.LENGTH_SHORT).show();
// 清除以前的SharePreferences密码
clearSharePassword();
}
}
}; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
findViewsById();
initView(false);
// 需要去submitListener里面设置URL
setListener();
} /** 初始化注册View组件 */
private void findViewsById() {
view_userName = (EditText) findViewById(R.id.loginUserNameEdit);
view_password = (EditText) findViewById(R.id.loginPasswordEdit);
view_rememberMe = (CheckBox) findViewById(R.id.loginRememberMeCheckBox);
view_loginSubmit = (Button) findViewById(R.id.loginSubmit);
//view_loginRegister = (Button) findViewById(R.id.loginRegister);
} /**
* 初始化界面
*
* @param isRememberMe
* 如果当时点击了RememberMe,并且登陆成功过一次,则saveSharePreferences(true,ture)后,则直接进入
* */
private void initView(boolean isRememberMe) {
SharedPreferences share = getSharedPreferences(SHARE_LOGIN_TAG, 0);
String userName = share.getString(SHARE_LOGIN_USERNAME, "");
String password = share.getString(SHARE_LOGIN_PASSWORD, "");
Log
.d(this.toString(), "userName=" + userName + " password="
+ password);
if (!"".equals(userName)) {
view_userName.setText(userName);
}
if (!"".equals(password)) {
view_password.setText(password);
view_rememberMe.setChecked(true);
}
// 如果密码也保存了,则直接让登陆按钮获取焦点
if (view_password.getText().toString().length() > 0) {
// view_loginSubmit.requestFocus();
// view_password.requestFocus();
}
share = null;
} /**
* 检查用户登陆,服务器通过DataOutputStream的dos.writeInt(int);来判断是否登录成功(
* 服务器返回int>0登陆成功,否则失败),登陆成功后根据isRememberMe来判断是否保留密码(用户名是会保留的),
* 如果连接服务器超过5秒,也算连接失败.
*
* @param userName
* 用户名
* @param password
* 密码
* @param validateUrl
* 检查登陆的地址
* */
private boolean validateLocalLogin(String userName, String password,
String validateUrl) {
System.out.println("username:"+userName);
System.out.println("password:"+password);
// 用于标记登陆状态
boolean loginState = false; HttpPost httpRequest =new HttpPost(validateUrl);
//Post运作传送变数必须用NameValuePair[]阵列储存 //传参数 服务端获取的方法为request.getParameter("name") List params=new ArrayList();
params.add(new BasicNameValuePair("Username",userName));
params.add(new BasicNameValuePair("Pwd",password));
try{ //发出HTTP request httpRequest.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8)); //取得HTTP response
HttpResponse httpResponse=new DefaultHttpClient().execute(httpRequest);
//若状态码为200 ok if(httpResponse.getStatusLine().getStatusCode()==200){
//取出回应字串 strResult=EntityUtils.toString(httpResponse.getEntity());
System.out.println("strResult: "+strResult);
}
}catch(Exception e){
e.printStackTrace();} if(strResult.equals("<script>window.location.href='index.php'</script>")){
loginState = true;
}
// 登陆成功
if (loginState) {
if (isRememberMe()) {
saveSharePreferences(true, true);
} else {
saveSharePreferences(true, false);
}
} else {
// 如果不是网络错误
if (!isNetError) {
clearSharePassword();
}
}
if (!view_rememberMe.isChecked()) {
clearSharePassword();
}
return loginState;
} /**
* 如果登录成功过,则将登陆用户名和密码记录在SharePreferences
*
* @param saveUserName
* 是否将用户名保存到SharePreferences
* @param savePassword
* 是否将密码保存到SharePreferences
* */
private void saveSharePreferences(boolean saveUserName, boolean savePassword) {
SharedPreferences share = getSharedPreferences(SHARE_LOGIN_TAG, 0);
if (saveUserName) {
Log.d(this.toString(), "saveUserName="
+ view_userName.getText().toString());
share.edit().putString(SHARE_LOGIN_USERNAME,
view_userName.getText().toString()).commit();
}
if (savePassword) {
share.edit().putString(SHARE_LOGIN_PASSWORD,
view_password.getText().toString()).commit();
}
share = null;
} /** 记住我的选项是否勾选 */
private boolean isRememberMe() {
if (view_rememberMe.isChecked()) {
return true;
}
return false;
} /** 登录Button Listener */
private OnClickListener submitListener = new OnClickListener() {
@Override
public void onClick(View v) {
proDialog = ProgressDialog.show(Login.this, "连接中..",
"连接中..请稍后....", true, true);
// 开一个线程进行登录验证,主要是用于失败,成功可以直接通过startAcitivity(Intent)转向
Thread loginThread = new Thread(new LoginFailureHandler());
loginThread.start();
}
}; /** 记住我checkBoxListener */
private OnCheckedChangeListener rememberMeListener = new OnCheckedChangeListener() { @Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (view_rememberMe.isChecked()) {
Toast.makeText(Login.this, "如果登录成功,以后账号和密码会自动输入!",
Toast.LENGTH_SHORT).show();
}
}
}; /** 注册Listener */
private OnClickListener registerLstener = new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(Login.this, Register.class);
// 转向注册页面
startActivity(intent);
}
}; /** 设置监听器 */
private void setListener() {
view_loginSubmit.setOnClickListener(submitListener);
view_loginRegister.setOnClickListener(registerLstener);
view_rememberMe.setOnCheckedChangeListener(rememberMeListener);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, MENU_EXIT, 0, getResources().getText(R.string.MENU_EXIT));
menu.add(0, MENU_ABOUT, 0, getResources().getText(R.string.MENU_ABOUT));
return true;
} @Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
super.onMenuItemSelected(featureId, item);
switch (item.getItemId()) {
case MENU_EXIT:
finish();
break;
case MENU_ABOUT:
alertAbout();
break;
}
return true;
} /** 弹出关于对话框 */
private void alertAbout() {
new AlertDialog.Builder(Login.this).setTitle(R.string.MENU_ABOUT)
.setMessage(R.string.aboutInfo).setPositiveButton(
R.string.ok_label,
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialoginterface, int i) {
}
}).show();
} /** 清除密码 */
private void clearSharePassword() {
SharedPreferences share = getSharedPreferences(SHARE_LOGIN_TAG, 0);
share.edit().putString(SHARE_LOGIN_PASSWORD, "").commit();
share = null;
} class LoginFailureHandler implements Runnable {
@Override
public void run() {
userName = view_userName.getText().toString();
password = view_password.getText().toString();
//这里换成你的验证地址
String validateURL="http://10.0.2.2/jqueryRegister02/login.php";
boolean loginState = validateLocalLogin(userName, password,
validateURL);
Log.d(this.toString(), "validateLogin"); // 登陆成功
if (loginState) {
// 需要传输数据到登陆后的界面,
Intent intent = new Intent();
intent.setClass(Login.this, Json2Lv.class);
Bundle bundle = new Bundle();
bundle.putString("MAP_USERNAME", userName);
intent.putExtras(bundle);
// 转向登陆后的页面
startActivity(intent);
proDialog.dismiss();
} else {
// 通过调用handler来通知UI主线程更新UI,
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putBoolean("isNetError", isNetError);
message.setData(bundle);
loginHandler.sendMessage(message);
}
} }
}
没有看到重点啊?
AndroidManifest 有没有设置呢?Activity名字有没有写对呢?
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.php"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ui.Login"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.Register" />
<activity android:name=".ui.Login" />
<activity android:name=".ui.IndexPage" />
<activity android:name=".URLCheck" />
<activity android:name=".Json2Lv" />
</application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>