android loginDemo +WebService用户登录验证
- <merge xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- tools:context=".LoginActivity" >
- <!-- Login progress -->
- <!-- merge与FrameLayout布局相同,都是帧布局,不同的是,当LayoutInflater遇到这个标签时,它会跳过它,并将<merge />内的元素添加到<merge />的父元素里。 -->
- <!-- 这个线性布局是验证等待对话框的根元素,这个线性布局包含一个环形进度条,和一个字符标签 -->
- <!-- 设置子元素在这个布局中心排布 -->
- <!-- 设置该布局在父布局及界面中心水平放置 -->
- <!-- 设置子布局纵向布局 -->
- <!-- 设置这个布局界面隐藏不可见 -->
- <LinearLayout
- android:id="@+id/login_status"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:gravity="center_horizontal"
- android:orientation="vertical"
- android:visibility="gone" >
- <ProgressBar
- style="?android:attr/progressBarStyleLarge"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="8dp" />
- <TextView
- android:id="@+id/login_status_message"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="16dp"
- android:fontFamily="sans-serif-light"
- android:text="@string/login_progress_signing_in"
- android:textAppearance="?android:attr/textAppearanceMedium" />
- </LinearLayout>
- <!-- Login form -->
- <!-- 根目录为滚动试图 -->
- <ScrollView
- android:id="@+id/login_form"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <!-- 线性纵向排布 -->
- <LinearLayout
- style="@style/LoginFormContainer"
- android:orientation="vertical" >
- <!--邮箱输入框 -->
- <!--hint:设置编辑框无输入显示,设置输入类型为Email型,设置为一行、单行模式 -->
- <EditText
- android:id="@+id/email"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="@string/prompt_email"
- android:inputType="textEmailAddress"
- android:maxLines="1"
- android:singleLine="true" />
- <!-- 密码输入框 -->
- <!-- imeActionLabel设置编辑文本“下一步”的显示内容,imeActionId设置“下一步”的ID, 设置“完成”,设置输入格式显示***-->
- <EditText
- android:id="@+id/password"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="@string/prompt_password"
- android:imeActionId="@+id/login"
- android:imeActionLabel="@string/action_sign_in_short"
- android:imeOptions="actionUnspecified"
- android:inputType="textPassword"
- android:maxLines="1"
- android:singleLine="true" />
- <!-- 提交按钮 -->
- <!--paddingLeft设置左边距 -->
- <Button
- android:id="@+id/sign_in_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right"
- android:layout_marginTop="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp"
- android:text="@string/action_sign_in_register" />
- </LinearLayout>
- </ScrollView>
- </merge>
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_login);
- // Set up the login form.
- //获取引入的邮箱并显示
- mEmail = getIntent().getStringExtra(EXTRA_EMAIL);
- mEmailView = (EditText) findViewById(R.id.email);
- mEmailView.setText(mEmail);
- //在密码编辑界面判断软键盘的选择,做对应操作
- mPasswordView = (EditText) findViewById(R.id.password);
- mPasswordView
- .setOnEditorActionListener(new TextView.OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView textView, int id,
- KeyEvent keyEvent) {
- if (id == R.id.login || id == EditorInfo.IME_NULL) {//判断软件盘选择的内容
- attemptLogin();
- return true;
- }
- return false;
- }
- });
- mLoginFormView = findViewById(R.id.login_form);
- mLoginStatusView = findViewById(R.id.login_status);
- mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);
- //提交按键响应处理
- findViewById(R.id.sign_in_button).setOnClickListener(
- new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- attemptLogin();
- }
- });
- }
- public void attemptLogin() {
- if (mAuthTask != null) {
- return;
- }
- //设置输入框的错误提示为空
- mEmailView.setError(null);
- mPasswordView.setError(null);
- //获取输入框的邮箱和密码
- mEmail = mEmailView.getText().toString();
- mPassword = mPasswordView.getText().toString();
- boolean cancel = false;
- View focusView = null;
- // 设置密码输入框的格式(不能为空,不能小于4位)如果格式错误重新获得焦点,并提示错误内容
- if (TextUtils.isEmpty(mPassword)) {
- mPasswordView.setError(getString(R.string.error_field_required));
- focusView = mPasswordView;
- cancel = true;
- } else if (mPassword.length() < 4) {
- mPasswordView.setError(getString(R.string.error_invalid_password));
- focusView = mPasswordView;
- cancel = true;
- }
- // 设置邮箱格式
- if (TextUtils.isEmpty(mEmail)) {
- mEmailView.setError(getString(R.string.error_field_required));
- focusView = mEmailView;
- cancel = true;
- } else if (!mEmail.contains("@")) {
- mEmailView.setError(getString(R.string.error_invalid_email));
- focusView = mEmailView;
- cancel = true;
- }
- if (cancel) {
- //如果格式错误,输入框重新获得输入焦点
- focusView.requestFocus();
- } else {
- //如果输入的格式正确,显示验证等待对话框,并启动验证线程
- mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
- showProgress(true);
- mAuthTask = new UserLoginTask();
- mAuthTask.execute((Void) null);
- }
- }
- @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)//指出应用程序的API版本
- private void showProgress(final boolean show) {
- //获取运行平台的版本与应用的版本对比实现功能的兼容性
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
- int shortAnimTime = getResources().getInteger(
- android.R.integer.config_shortAnimTime);//获取系统定义的时间
- mLoginStatusView.setVisibility(View.VISIBLE);//设置验证对话框为可显
- mLoginStatusView.animate().setDuration(shortAnimTime)//设置动画显示时间
- .alpha(show ? 1 : 0)//设置动画渐变效果
- .setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mLoginStatusView.setVisibility(show ? View.VISIBLE
- : View.GONE);//跟据参数控制该控件显示或隐藏
- }
- });
- mLoginFormView.setVisibility(View.VISIBLE);//设置输入界面可显
- mLoginFormView.animate().setDuration(shortAnimTime)
- .alpha(show ? 0 : 1)
- .setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mLoginFormView.setVisibility(show ? View.GONE
- : View.VISIBLE);
- }
- });
- } else {
- mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);//跟据参数控制该控件显示或隐藏
- mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
- }
- }
- public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
- @Override
- protected Boolean doInBackground(Void... params) {//后台运行线程
- try {
- //模拟用户验证耗时
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- return false;
- }
- for (String credential : DUMMY_CREDENTIALS) {//遍历数组验证自定义用户及密码
- String[] pieces = credential.split(":");//分割字符串,将密码个邮箱分离开
- if (pieces[0].equals(mEmail)) {
- return pieces[1].equals(mPassword);
- }
- }
- return true;
- }
- @Override
- protected void onPostExecute(final Boolean success) {//线程结束后的ui处理
- mAuthTask = null;
- showProgress(false);//隐藏验证延时对话框
- if (success) {
- finish();
- } else {//密码错误,输入框获得焦点,并提示错误
- mPasswordView
- .setError(getString(R.string.error_incorrect_password));
- mPasswordView.requestFocus();
- }
- }
- //取消验证
- @Override
- protected void onCancelled() {
- mAuthTask = null;
- showProgress(false);
- }
- }
- }
注意事项:这个demo为模块界面,其本身不是系统的默认启动界面,要想程序正常工作,要在AndroidManifest.xml中添加如下代码
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
三、添加WebService用户登录验证代码
- /*******************************************/
- final static String SERVICE_NS = "http://tempuri.org/"; //Webservice所在命名空间
- final static String SERVICE_URL = "http://192.168.1.213:9006/WS_Base.asmx";//Webservice服务地址
- final static String methodName = "AuthenticateLogin";//要使用的接口函数
- private HttpTransportSE ht; //该对象用于调用WebService操作
- private SoapSerializationEnvelope envelope;//上一个类信息的载体
- private SoapObject soapObject; //将参数传递给WebService
- /**********************************************/
- public class UserLoginTask extends AsyncTask<String, Void, Boolean> {
- @Override
- protected Boolean doInBackground(String... params) {
- // TODO: attempt authentication against a network service.
- //set webservices attribute
- /***********************************************/
- //创建HttpTransportSE对象,该对象用于调用WebService操作
- ht = new HttpTransportSE(SERVICE_URL);
- ht.debug = true;
- //创建SoapSerializationEnvelope对象,它是HttpTransportSE调用WebService时消息
- //的载体;客户端需要传入的参数,需要通过SoapSerializationEnvelope对象的bodyOut属性
- //传给服务器;服务器响应生成的SOAP消息也通过该对象的bodyIn属性来获取。
- envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//指明SOPA规范
- //创建SoapObject对象,创建对象时需要传入调用Web Service的命名空间、方法名。
- soapObject = new SoapObject(SERVICE_NS, methodName);
- /************************************************************/
- //SoapObject 对象的addProperty(String name,Object value)方法将参数传递给服务端
- //该方法的name参数指定参数名;value参数指定参数值。
- //如果方法存在多个参数,多次调用addProperty即可。
- soapObject.addProperty("userName",params[0]);
- soapObject.addProperty("password",params[1]);
- envelope.bodyOut = soapObject;
- //设置WebService的开发类型
- envelope.dotNet = true;
- try
- {
- //调用远程WebService,call()方法的参数意义 第一个参数:命名空间+方法名,
- //第二个参数:SoapSerializationEnvelope对象
- ht.call(SERVICE_NS+methodName, envelope);
- if(envelope.getResponse()!=null)
- {
- //SoapSerializationEnvelope对象的bodyIn属性返回一个SoapObject对象,
- //该对象就代表了WebService的返回消息。
- //WebService在服务器端返回值是String类型的数值的时候使用Object代替SoapObject
- SoapObject result = (SoapObject)envelope.bodyIn;
- Object detail1 = (Object) result.getProperty(0);
- return detail1.toString().equals("true");
- }
- return false;
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- catch (XmlPullParserException e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- return false;
- }
- @Override
- protected void onPostExecute(final Boolean success) {
- mAuthTask = null;
- showProgress(false);
- if (success) {
- finish();
- } else {
- mPasswordView
- .setError(getString(R.string.error_incorrect_password));
- mPasswordView.requestFocus();//设置密码框获得焦点
- }
- }
- @Override
- protected void onCancelled() {
- mAuthTask = null;
- showProgress(false);
- }
- }
1.View.VISIBLE,常量值为0,意思是可见的2.View.INVISIBLE,常量值是4,意思是不可见的3.View.GONE,常量值是8,意思是不可见的,并且不占用布局空间
android loginDemo +WebService用户登录验证的更多相关文章
- Python程序练习1-模拟用户登录验证
1.功能简介 此程序模拟用户登录验证的过程,实现用户名输入.黑名单检测.用户有效性判别.密码输入及验证等.用户在3次以内输入正确密码登陆成功,连续输错3次密码登陆失败,且该用户名被记录在黑名单,黑名单 ...
- djangorestframework-jwt自带的认证视图进行用户登录验证源代码学习
Django REST framework JWT djangorestframework-jwt自带的认证视图进行用户登录验证源代码学习 SECRET_KEY = '1)q(f8jrz^edwtr2 ...
- cookie实现用户登录验证
cookie实现用户登录验证 1, INSTALLED_APPS中注册app03 2,在主程序中新建映射关系到app3的url中 from django.conf.urls import url,in ...
- python3 用户登录验证的小功能
用户登录验证,记录一下,还需要修改黑名单不合理 #!/usr/bin/env python3 ''' 需求:编写登录接口 1.输入用户名和密码 2.验证用户密码成功后输出欢迎消息 3.3次没有验证通过 ...
- 如何使用Django实现用户登录验证
最初开始搞用户登录验证的时候感觉没什么难的,不就是增删改查中的查询数据库么,但是还是遇到许多小问题,而且感觉在查询数据库的时候,要把前端的数据一条一条的进行比对,会导致我的代码很丑,而且方式很不智,所 ...
- 用javascript实现简单的用户登录验证
用javascript实现简单的用户登录验证 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- django 从零开始 8 用户登录验证 待测
看文档 djang 自带一个用户登录验证的方法,不过有些看着懵逼,去网上找了一圈,发现很多都是照抄文档说明的,几乎没说啥原理 特别是 from django.contrib.auth import a ...
- Java初学者作业——编写Java程序,实现用户登录验证。
返回本章节 返回作业目录 需求说明: 编写Java程序,实现用户登录验证. 若用户名与密码输入正确,则提示"登录成功,欢迎回来!",若用户名与密码不匹配,则提示"用户名和 ...
- ASP.NET MVC3 实现用户登录验证
自定义一个授权筛选器类,继承于AuthorizeAttribute: using System; using System.Web; using System.Web.Mvc; namespace M ...
随机推荐
- Ogre中TerrainSceneManager
转自:http://blog.csdn.net/yanonsoftware/article/details/1103665 TerrainSceneManager是一个OctreeSceneManag ...
- [转]dev C++编写windows程序遇到问题
1.工具-编译选项-编译器-在连接器命令行加入以下命令: -mwindows 2.出现错误:undefined reference to `PlaySoundA@12' 解决办法:工具-编译选项-编译 ...
- windows socket网络编程基础知识
下面介绍网络7层协议在WINDOWS的实现: 7层协议 WIN系统 ________________________________________ 7 应用层 7 应用程序 ____________ ...
- JQuery源码解析(九)
jQuery回调对象 jQuery.Callbacks一般开发者接触的很少,虽然jQuery向开发者提供了外部接口调用,但是$.Callbacks()模块的开发目的是为了给内部$.ajax() 和 $ ...
- Object-C 基础笔记3---属性
一,区别属性和实例变量 实例变量就是声明在接口大括号里面的变量.@public类型的实例变量直接使用->访问, property 属性是一组设置器和访问器,属性是方法不是变量. 与类相似,属性需 ...
- PHP 防范IP攻击
<?php //查询禁止IP $ip =$_SERVER['REMOTE_ADDR']; $fileht=".htaccess2"; if(!file_exists($fil ...
- 解决DatePicker中Appbar icon缺失
最近写了个小程序,用到了Microsoft.Phone.Controls.Toolkit里的DatePicker控件,引入以后发现AppBar里两个button的图标不显示.如下图: 们是“完成”和“ ...
- Magento Soap Api接口出错无法使用
在给客户测试Magento Soap接口的时候出现如下错误提示. This page contains the following errors:error on line 3 at column 6 ...
- C++宏定义中"#"与"##"的妙用
在C++开发当中经常用到宏的定义当中使用"#"或者"##",以下是对着两种符号使用方法的简单描述: define中的#就是把#后面的参数当做一个符号来使用,简单 ...
- [转】HTTP请求流程(二)----Telnet模拟HTTP请求
转自: http://www.cnblogs.com/stg609/archive/2008/07/06/1237000.html 上一部分"流程简介", 我们大致了解了下HTTP ...