好开心,终于解决了。从学习android到现在写登录功能已经不是一次两次了,如今再写想着肯定是信手拈来,没有想到的是尽然折磨了我一天的时间才搞定它。唉。。。。。。
先来看几张截图,这次的登录跟以往的不同加了一点东西在上面。下面看截图吧。
下面是我对这次问题的一个截图:
下面这个问题是安卓模拟器访问url的时候出现拒绝的错误。我的解决办法是把url中的127.0.0.1换成了本机的IP地址。就不出现错误了。
下面是我遇到的第二个问题的截图:
出现了乱码,原因是:我编译服务器端的编码不是utf-8。改正为utf-8就可以了。
接下来是我的服务器的配置代码:
<?php return array( // 添加数据库配置信息 'DB_TYPE'=>'mysql',// 数据库类型 'DB_HOST'=>'127.0.0.1',// 服务器地址 'DB_NAME'=>'meeting',// 数据库名 'DB_USER'=>'root',// 用户名 'DB_PWD'=>'123456',// 密码 'DB_PORT'=>3306,// 端口 'DB_PREFIX'=>'m_',// 数据库表前缀 'DB_CHARSET'=>'utf8',// 数据库字符集 'DEFAULT_THEME' =>'', 'LAYOUT_ON'=>true, 'LAYOUT_NAME'=>'layout', );
下面是我的android端的代码:
先看一下目录:
SplashActivity.java
package cn.edu.aynu.rjxy.activity; import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import org.json.JSONException; import org.json.JSONObject; import com.lidroid.xutils.HttpUtils; import com.lidroid.xutils.exception.HttpException; import com.lidroid.xutils.http.ResponseInfo; import com.lidroid.xutils.http.callback.RequestCallBack; import cn.edu.aynu.rjxy.paths.Paths; import cn.edu.aynu.rjxy.utils.StreamUtils; import cn.edu.aynu.rjxy.utils.ToastUtils; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.view.Menu; import android.view.View; import android.view.Window; import android.widget.TextView; import android.widget.Toast; /* * 展示品牌---->初始化数据---->检查版本---->校验合法性 */ public class SplashActivity extends Activity { private static final int UPDATE_DIALOG = 1;//更新提醒 private static final int NETWORK_ERROR = 2;//网络异常 private static final int JSON_ERROR = 3;//数据解析失败 private static final int URL_ERROR = 4;//网络异常 private static final int ENTER_HOME = 5;//跳转主页面 //控件初始化 private TextView tvVersion; private TextView tvProgress; //服务器的返回值 private String mVersionName;//成员变量 private int mVersionCode; private String mDescription; private String mDownloadUrl; //消息传递 private Handler mHandler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case UPDATE_DIALOG: showUpdateDialog(); break; case NETWORK_ERROR: ToastUtils.showToast(getApplicationContext(), "网络异常"); enterHome(); break; case JSON_ERROR: ToastUtils.showToast(getApplicationContext(), "数据解析失败"); enterHome(); break; case URL_ERROR: ToastUtils.showToast(getApplicationContext(), "网络连接异常"); enterHome(); break; case ENTER_HOME: enterHome(); default: break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_splash); tvVersion = (TextView)findViewById(R.id.tv_version); tvProgress = (TextView)findViewById(R.id.tv_progress); tvVersion.setText("版本名:"+getVersionName()); checkVersion();//检查版本 } /* * 检查版本更新 */ private void checkVersion() { // TODO Auto-generated method stub new Thread(){ long startTime = System.currentTimeMillis();//开始时间 Message msg = Message.obtain();//获取消息 public void run(){ try { // URL url = new URL(Paths.downApkPath); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setConnectTimeout(2000);//连接网络超时 conn.setReadTimeout(2000);//读取超时 conn.setRequestMethod("GET");//访问方法 conn.connect();//连接网络 int responseCode = conn.getResponseCode(); if(responseCode == 200){ String result = StreamUtils.streamToString(conn.getInputStream()); System.out.println("访问成功--->"+result); //json数据解析 JSONObject jo = new JSONObject(result); mVersionName = jo.getString("versionName"); mVersionCode = jo.getInt("versionCode"); mDescription = jo.getString("description"); mDownloadUrl = jo.getString("downloadUrl"); System.out.println("versionCode--->"+mVersionCode); if (getVersionCode()<mVersionCode) {//如果软件的版本与网络中的版本号不一致,提示用户更新版本 System.out.println("有新版本!!!"); msg.what = UPDATE_DIALOG; }else{ System.out.println("没有新版本!!!"); //跳转到主页面 msg.what = ENTER_HOME; } } } catch (MalformedURLException e) { //url异常 // TODO Auto-generated catch block msg.what = URL_ERROR; e.printStackTrace(); } catch (IOException e) { //网络异常 // TODO Auto-generated catch block msg.what = NETWORK_ERROR; e.printStackTrace(); }catch (JSONException e) { //json异常 // TODO Auto-generated catch block e.printStackTrace(); msg.what = JSON_ERROR; }finally{ long endTime = System.currentTimeMillis();//访问网络结束时间 long timeUsed = endTime - startTime;//访问网络总的用时 if (timeUsed<2000) {//如果访问网络的时间小于2秒,就展示闪屏页面。目的是凑够两秒,来展示软件的品牌。 try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } mHandler.sendMessage(msg);//发送消息 } } }.start(); } /* * 用于提醒用户更新的提示窗 */ protected void showUpdateDialog() { // TODO Auto-generated method stub AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("发现新版本:"+mVersionName); builder.setMessage(mDescription);//新版本的描述 builder.setPositiveButton("立即升级", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub System.out.println("发现新版本"); downloadApk(); } }); builder.setNegativeButton("以后再说", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub enterHome(); } }); builder.show(); } /* * 下载安装包 */ protected void downloadApk(){ String target = Environment.getExternalStorageDirectory().getAbsolutePath()+"/huiyi.apk"; tvProgress.setVisibility(View.VISIBLE); HttpUtils utils = new HttpUtils(); utils.download(mDownloadUrl, target, new RequestCallBack<File>() { //下载成功 @Override public void onSuccess(ResponseInfo<File> responseInfo) { // TODO Auto-generated method stub System.out.println("下载成功!!!!"); File result = responseInfo.result; tvProgress.setVisibility(View.GONE); enterHome(); } /* * 正在下载 * total 文件总大小 * current 当前下载的大小 * isUploading 是否正在上传 * (non-Javadoc) * @see com.lidroid.xutils.http.callback.RequestCallBack#onLoading(long, long, boolean) */ public void onLoading(long total, long current, boolean isUploading) { // TODO Auto-generated method stub super.onLoading(total, current, isUploading); //����ٷֱ� int percent = (int) ((current*100)/total); tvProgress.setText("下载进度:"+percent+"%"); } //下载失败 @Override public void onFailure(HttpException error, String msg) { // TODO Auto-generated method stub System.out.println("下载失败!!!!"); //ToastUtils.showToast(getApplicationContext(),"下载失败!!"); error.printStackTrace(); } }); } /* * 获取版本名 */ private String getVersionName() { // TODO Auto-generated method stub //获取包管理器 PackageManager pm = getPackageManager(); try { PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0); int versionCode = packageInfo.versionCode;//获取版本号 String versionName = packageInfo.versionName;//获取版本名 System.out.println("versionName"+versionName+",versionCode"+versionCode); return versionName; } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ""; } /* * 获取版本号 */ private int getVersionCode() { // TODO Auto-generated method stub //获取包管理器 PackageManager pm = getPackageManager(); try { PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0); int versionCode = packageInfo.versionCode;//获取版本号 return versionCode; } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } //跳转到主页面 private void enterHome(){ startActivity(new Intent(this,LoginActivity.class));//开启的新的页面 finish();//结束原来的页面 } }
LoginActivity.java
package cn.edu.aynu.rjxy.activity; import java.lang.ref.WeakReference; import java.net.SocketException; import org.apache.http.conn.ConnectTimeoutException; import cn.edu.aynu.rjxy.exception.SeriviceRulesException; import cn.edu.aynu.rjxy.service.UserService; import cn.edu.aynu.rjxy.service.UserServiceImpl; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; /** * 根据不同的身份实现登录功能 * @author Administrator * */ public class LoginActivity extends Activity { private static final int LOGIN_SUCCESS = 1; private static final String ErrorMsg = "登录失败"; private static final String SUCCESS = "登录成功"; public static final String MSG_LOGIN_FAILED = "登录名或密码出错"; public static final String MSG_SERVER_ERROR = "服务器错误"; public static final String MSG_CONNECT_TIME0UT = "服务连接超时"; public static final String MSG_REQUEST_TIMEOUT = "服务器响应超时"; private static ProgressDialog dialog; private EditText et_name; private EditText et_psw; private Button btn_login; private Spinner spin_id = null; private String spinnerId = "员工"; private String[] ids = new String[]{"超级管理员","管理员","员工"}; ArrayAdapter<String> idAdapter = null; private UserService userService = new UserServiceImpl(); /* * 初始化控件 */ private void init(){ et_name = (EditText)findViewById(R.id.et_name); et_psw = (EditText)findViewById(R.id.et_psw); btn_login = (Button) findViewById(R.id.btn_login); } @Override protected void onCreate(Bundle savedInstanceState) { //初始化布局 requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); //初始化控件 init(); //设置下拉框 setSpinner(); btn_login.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub final String userName = et_name.getText().toString().trim(); final String userPassword = et_psw.getText().toString().trim(); /* * 输入值验证,判断用户名和密码是否为空 */ if (TextUtils.isEmpty(userName)||TextUtils.isEmpty(userPassword)) { Toast.makeText(LoginActivity.this, "账号或者密码不能为空!", 0).show(); }else{ /* * loading.... */ if (dialog == null) { dialog = new ProgressDialog(LoginActivity.this); } dialog.setTitle("请等待"); dialog.setMessage("正在登录中..."); dialog.setCancelable(false); dialog.show(); /* * 副线程 */ Thread thread = new Thread(new Runnable() { @Override public void run() { try{ userService.userLogin(spinnerId,userName, userPassword); System.out.println(userName+userPassword); handler.sendEmptyMessage(LOGIN_SUCCESS); }catch(SocketException e){ e.printStackTrace(); Message msg = new Message(); Bundle data = new Bundle(); data.putSerializable("ErrorMsg", MSG_REQUEST_TIMEOUT); msg.setData(data); handler.sendMessage(msg); }catch(ConnectTimeoutException e){ e.printStackTrace(); Message msg = new Message(); Bundle data = new Bundle(); data.putSerializable("ErrorMsg", MSG_CONNECT_TIME0UT); msg.setData(data); handler.sendMessage(msg); }catch(SeriviceRulesException e){ e.printStackTrace(); Message msg = new Message(); Bundle data = new Bundle(); data.putSerializable("ErrorMsg", e.getMessage()); msg.setData(data); handler.sendMessage(msg); }catch(Exception e){ e.printStackTrace(); Message msg = new Message(); Bundle data = new Bundle(); data.putSerializable("ErrorMsg", ErrorMsg); msg.setData(data); handler.sendMessage(msg); } } }); thread.start(); } } }); } /* * 设置下拉框 */ private void setSpinner() { spin_id = (Spinner) findViewById(R.id.spin_id); //绑定适配器和值 idAdapter = new ArrayAdapter<String>(LoginActivity.this, android.R.layout.simple_spinner_item,ids); spin_id.setAdapter(idAdapter); spin_id.setSelection(2,true);//设置默认选项,此处默认的是第二个选项,即员工 spin_id.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) { spinnerId = ids[position]; System.out.println("spinnerId"+spinnerId); } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); } private static class IHandler extends Handler{ private final WeakReference<Activity> mactivity; public IHandler(LoginActivity activity){ mactivity = new WeakReference<Activity>(activity); } @Override public void handleMessage(Message msg) { if (dialog != null) { dialog.dismiss(); } int flag = msg.what; switch (flag) { case 0: String errorMsg = (String)msg.getData().getSerializable("ErrorMsg"); ((LoginActivity)mactivity.get()).showTip(ErrorMsg); break; case LOGIN_SUCCESS: ((LoginActivity)mactivity.get()).showTip(SUCCESS); break; default: break; } } } private IHandler handler = new IHandler(this); private void showTip(String str) { Toast.makeText(this, str, 0).show(); } }
SeriviceRulesException.java
package cn.edu.aynu.rjxy.exception; public class SeriviceRulesException extends Exception{ /** * 异常处理 */ private static final long serialVersionUID = 7075843798349210359L; public SeriviceRulesException(String msg) { super(msg); } }
UserService.java
package cn.edu.aynu.rjxy.service; public interface UserService { public void userLogin(String spinnerId,String name,String password)throws Exception; }
UserServiceImpl.java(需要说明的是注释的代码也是可以实现的,两种不同的写法)
package cn.edu.aynu.rjxy.service; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import android.util.Log; import cn.edu.aynu.rjxy.activity.LoginActivity; import cn.edu.aynu.rjxy.exception.SeriviceRulesException; import cn.edu.aynu.rjxy.paths.Paths; import cn.edu.aynu.rjxy.utils.StreamTools; public class UserServiceImpl implements UserService{ private static final String TAG = "UserServiceImpl"; @Override public void userLogin(String spinnerId,String name, String password) throws Exception { Log.d(TAG, spinnerId); Log.d(TAG, name); Log.d(TAG, password); Thread.sleep(3000); URL url = new URL(Paths.loginPath); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("User-Agent", "Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//请求的类型 表单数据 String data = "sno="+name+"&s_password="+password+"&spinnerId="+URLEncoder.encode(spinnerId, "UTF-8"); conn.setRequestProperty("Content-Length", data.length()+"");//数据的长度 conn.setDoOutput(true);//设置向服务器写数据 byte[] bytes = data.getBytes(); conn.getOutputStream().write(bytes);//把数据以流的方式写给服务器 int code = conn.getResponseCode(); System.out.println(code); /*HttpParams params = new BasicHttpParams(); // HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); HttpConnectionParams.setConnectionTimeout(params, 3000); HttpConnectionParams.setSoTimeout(params, 3000); SchemeRegistry schreg = new SchemeRegistry(); schreg.register(new Scheme("http",PlainSocketFactory.getSocketFactory(),80)); schreg.register(new Scheme("https", PlainSocketFactory.getSocketFactory(), 433)); ClientConnectionManager conman = new ThreadSafeClientConnManager(params, schreg); HttpClient client = new DefaultHttpClient(conman, params); String url = ""; HttpPost post = new HttpPost(url); NameValuePair paramLoginSpinnerId = new BasicNameValuePair("spinnerId", spinnerId); NameValuePair paramLoginName = new BasicNameValuePair("sno", name); NameValuePair paramLoginPassword = new BasicNameValuePair("password", password); List <NameValuePair> param = new ArrayList<NameValuePair>(); param.add(paramLoginSpinnerId); param.add(paramLoginName); param.add(paramLoginPassword); post.setEntity(new UrlEncodedFormEntity(param,HTTP.UTF_8)); HttpResponse response = client.execute(post); //获取状态码 int code = response.getStatusLine().getStatusCode();*/ System.out.println(code); if (code != HttpStatus.SC_OK) { throw new SeriviceRulesException(LoginActivity.MSG_SERVER_ERROR); } InputStream is = conn.getInputStream(); String result = StreamTools.readStream(is); System.out.println(result); //String result = EntityUtils.toString(response.getEntity(),HTTP.UTF_8); if (result.equals("登录成功")) { }else{ throw new SeriviceRulesException(LoginActivity.MSG_LOGIN_FAILED); } } }
StreamTools.java
package cn.edu.aynu.rjxy.utils; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; public class StreamTools { public static String readStream(InputStream is){ try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = is.read(buffer))!=-1) { baos.write(buffer,0,len); } baos.close(); return new String(baos.toByteArray()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return ""; } } }
有一个文件夹下面存放的是地址:我没有给粘出来。