在企业应用中,手机与企业数据的交互必不可少,在这里我们通过实例来描述android怎样调用.net webservice

第一步:vs2008建webservice ,贴出代码:

clsoptuser.cs

public class clsoptuser
{
  //验证方法
public bool Validate( string u, string p)
{
bool k = false ;
SqlConnection userConn
= new SqlConnection( " 连接字符 " );
userConn.Open();
SqlCommand userComm
= new SqlCommand( " select *from user " , userConn);
SqlDataReader userDr
= userComm.ExecuteReader();
string tmpuser, tmppass;
while (userDr.Read())
{
int userindex = userDr.GetOrdinal( " user " );
int passindex = userDr.GetOrdinal( " password " );
tmpuser
= userDr.GetString(userindex);
tmppass
= userDr.GetString(passindex);         //用户名和口令正确返回true
if ((tmpuser == u) && (tmppass == p))
{
k
= true ;
break ;
}
}

return k;
}
}

Service.cs [WebMethod]
public bool ValidateUsername( string username, string pass, string validate)
{
if (validate == " webservice验证码 " )
{
clsoptuser objoptuser
= new clsoptuser();
return objoptuser.Validate(username, pass);

}
else
{

return false ;
}
}

以上是服务器端的代码,把上面程序布署到IIS,布署以后可以用IE测试,具体布署我就不说了,网上到处有!

第二步:android客户端

android调用webservice 要用到ksoap2-android-assembly-2.4-jar-with-dependencies.jar一个包,到网上可下载,然后在Eclipce项目中添加处部jar

  1、布局文件

main.xml

<? xml version = " 1.0 " encoding = " utf-8 " ?>
< LinearLayout xmlns:android = " http://schemas.android.com/apk/res/android "
android:orientation
= " vertical "
android:layout_width
= " fill_parent "
android:layout_height
= " fill_parent " android:background = " @drawable/login2 " android:gravity = " bottom " >

< LinearLayout android:id = " @+id/LinearLayout02 "
android:layout_height
= " wrap_content "
android:layout_width
= " fill_parent " >
< TextView android:layout_width = " wrap_content "
android:layout_height
= " wrap_content "
android:id
= " @+id/labeluser "
android:text
= " @string/labelname "
android:textStyle
= " bold "
android:textSize
= " 20sp " >
</ TextView >
< EditText android:layout_height = " wrap_content "
android:id
= " @+id/EditTextUser "
android:width
= " 150px "
android:layout_width
= " fill_parent " >
</ EditText >
</ LinearLayout >
< LinearLayout android:id = " @+id/LinearLayout03 "
android:layout_height
= " wrap_content "
android:layout_width
= " fill_parent " >
< TextView android:layout_width = " wrap_content "
android:layout_height
= " wrap_content "
android:id
= " @+id/labelpass "
android:text
= " 登录密码: "
android:textStyle
= " bold "
android:textSize
= " 20sp " >
</ TextView >
< EditText android:layout_height = " wrap_content "
android:id
= " @+id/EditTextPassWord "
android:password
= " true "
android:layout_width
= " fill_parent " >
</ EditText >
</ LinearLayout >
< LinearLayout android:id = " @+id/LinearLayout04 "   android:layout_height = " wrap_content "   android:layout_width = " fill_parent "   android:gravity = " center " > < CheckBox android:id = " @+id/CheckBox01 "     android:layout_width = " wrap_content "     android:layout_height = " wrap_content "     android:text = " 记住用户名和密码 "     android: checked = " true " >   </ CheckBox >
</ LinearLayout >





< LinearLayout android:id = " @+id/LinearLayout01 "     android:layout_height = " wrap_content "     android:layout_width = " fill_parent "     android:layout_gravity = " bottom "     android:gravity = " center " >     < Button android:id = " @+id/BtnLogin "         android:text = " 登 录 "         android:layout_height = " wrap_content "         android:layout_width = " wrap_content "         android:layout_weight = " 1 " >     </ Button >     < Button android:layout_width = " wrap_content "         android:layout_height = " wrap_content "         android:id = " @+id/BtnExit "         android:text = " 退 出 "        android:layout_weight = " 1 " >     </ Button >
</ LinearLayout >

</ LinearLayout >

想到每次进系统都要输入用户名和密码都恐怖(android的虚拟键盘确实不怎的),所以上面加了个"记住用户名和密码",方便下次不用输用户名和密码.

2、login.java

login.java package com.liwei.login;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;

import com.liwei.prohotel.clswdy.HttpThread;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;


public class login extends Activity {
Button btnlogin,btnexit;//登录和退出按钮对像
EditText edituser,editpass;//用户名和密码输入框对象
boolean data = false ;//调用webservice 近回的数据,验证成功true,失败false
HttpThread thread
= null ;//线程对像
String name
= "" ;//用户名
String pass
= "" ;//口令
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
btnlogin
= (Button)findViewById(R.id.BtnLogin);//获得用户名和密码按钮实例
btnexit
= (Button)findViewById(R.id.BtnExit);
edituser
= (EditText)findViewById(R.id.EditTextUser);//获得用户名和密码Edittext
editpass
= (EditText)findViewById(R.id.EditTextPassWord);     //获取上次保存的用户名和密码
SharedPreferences sp
= getSharedPreferences( " login " ,Context.MODE_PRIVATE);
String tempstr
= sp.getString( " username " , "" );
edituser.setText(tempstr);
editpass.setText(sp.getString(
" pass " , "" ));      //退出按钮点击事件
btnexit.setOnClickListener(
new View.OnClickListener() {

public void onClick(View arg0) {
// TODO Auto-generated method stub
finish();

}
});
//登录按钮点击事件
btnlogin.setOnClickListener(
new View.OnClickListener() {

public void onClick(View arg0) {
// TODO Auto-generated method stub


name = edituser.getText().toString();
pass
= editpass.getText().toString();

ResponseOnClickLogin(name, pass);


}
});
}

public void ResponseOnClickLogin(String username,String password){

thread
= new HttpThread(handlerwdy);//建立线程实例

HashMap
< String ,Object > params = new HashMap < String ,Object > ();
try{      String strvalidate = " galyglxxxt " ;
strvalidate
= new String(strvalidate.toString().getBytes(), " UTF-8 " );
params.put(
" username " , username); // 加入参数
params.put( " pass " , password);
params.put(
" validate " , strvalidate);
}
catch (Exception ex){
ex.printStackTrace();
}

String url = " 192.168.3.2:8080/loginweb/service.asmx " ;//webserivce地址
   String nameSpace = " http://tempuri.org/ " ;//空间名,可修改
   String methodName
= " ValidateUsername " ;//需调用webservice名称
   thread.doStart(url, nameSpace, methodName, params);//启动线程

  }
  //生成消息对象
Handler handlerwdy
= new Handler(){

public void handleMessage(Message m){
switch (m.what){
case 1 :
data
= m.getData().getBoolean( " data " );//从消息在拿出数据

if (data){
CheckBox cb
= (CheckBox)findViewById(R.id.CheckBox01);//如果要保存用户名和密码
if (cb.isChecked())
{
SharedPreferences sp
= getSharedPreferences( " login " ,Context.MODE_PRIVATE);
Editor editor
= sp.edit();
String tempname
= name;
editor.putString(
" username " , name);
editor.putString(
" pass " , pass);
editor.commit();
}
else
{
SharedPreferences sp
= getSharedPreferences( " login " ,Context.MODE_PRIVATE);
Editor editor
= sp.edit();
editor.putString(
" username " , "" );
editor.putString(
" pass " , "" );
editor.commit();
}
           //登录成功后的提示                  
Toast.makeText(prohotel.
this , getString(R.string.login_message), Toast.LENGTH_SHORT)
.show();
            //成功后界面要交给项目的主界面了
Intent in
= new Intent(prohotel. this ,promain. class );
//把用户名传给下一个activity
Bundle bundle
= new Bundle();
bundle.putString(
" KEY_USERNAME " ,name);
in.putExtras(bundle);
login.
this .startActivity(in);

}
else
{
          //验证不通过,给出个提示
SharedPreferences sp
= getSharedPreferences( " login " ,Context.MODE_PRIVATE);
Editor editor
= sp.edit();
editor.putString(
" username " , "" );
editor.putString(
" pass " , "" );
editor.commit();
new AlertDialog.Builder(prohotel. this )
.setTitle(getString(R.string.login_message_title))
.setMessage(getString(R.string.login_message_title))
.setIcon(R.drawable.cancel)
.setNeutralButton(getString(R.string.login_button_text),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dlg, int sumthin) {
// do nothing ?C it will close on its own
}
})
.show();
}
break ;
case 2 :          //收到了调用出错的消息       
new AlertDialog.Builder(prohotel. this )
.setTitle(
" 出错: " )
.setMessage(m.getData().getString(
" error " ))
.setNeutralButton(
" Close " , new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dlg, int sumthin) {
// do nothing ?C it will close on its own
}
})
.show();
break ;

}
}
};
//线程类

public class HttpThread extends Thread{
private Handler handle = null ;
String url
= null ;
String nameSpace
= null ;
String methodName
= null ;
HashMap
< String ,Object > params = null ;
ProgressDialog progressDialog
= null ;


public HttpThread(Handler hander){
handle
= hander;
}
//线程开始

public void doStart(String url, String nameSpace, String methodName,
HashMap
< String, Object > params) {
// 把参数传进来
this .url = url;
this .nameSpace = nameSpace;
this .methodName = methodName;
this .params = params;
//告诉使用者,请求开始了
progressDialog = new ProgressDialog(prohotel. this );
progressDialog.setTitle(
" 网络连接 " );
progressDialog.setMessage(
" 正在请求,请稍等...... " );
progressDialog.setIndeterminate(
true );
// progressDialog=ProgressDialog.show(clswdy.this, "网络连接","正在验证,请稍等......",true,true);
progressDialog.setButton( " 取消 " , new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int i) {
progressDialog.cancel();

}
});
progressDialog.setOnCancelListener(
new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
}
});
progressDialog.show();
this .start();//线程开始了
}
/**

*/
@Override
public void run() {
// TODO Auto-generated method stub
super .run();
try {
// web service请求,result为返回结果
boolean result = CallWebService();

if (result){

// 取消进度对话框
progressDialog.dismiss();
// clswdy.this.setProgressBarIndeterminateVisibility(false);
// 构造消息,验证通过了
Message message = handle.obtainMessage();
Bundle b
= new Bundle();
message.what
= 1 ;//这里是消息的类型
b.putBoolean(
" data " , true );//这里是消息传送的数据

message.setData(b);
handle.sendMessage(message);
}
else
{
progressDialog.dismiss();

Message message = handle.obtainMessage();
Bundle b
= new Bundle();
message.what
= 1 ;
b.putBoolean(
" data " , false );
message.setData(b);
handle.sendMessage(message);

}
}
catch (Exception ex){
progressDialog.dismiss();
// 构造消息,程序出错了
Message message = handle.obtainMessage();
Bundle b
= new Bundle();
message.what
= 2 ;

b.putString( " error " , ex.getMessage());

message.setData(b);
handle.sendMessage(message);


}
finally {

}
}

/**

*
*/
protected boolean CallWebService() throws Exception{
String SOAP_ACTION
= nameSpace + methodName;
boolean response = false ;
SoapObject request
= new SoapObject(nameSpace,methodName);
// boolean request=false;
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.dotNet
= true ;//.net 支持

// 参数

if (params != null && ! params.isEmpty() ){
for (Iterator it = params.entrySet().iterator();it.hasNext();){
Map.Entry e
= (Entry) it.next();
request.addProperty(e.getKey().toString(),e.getValue());

}
}
envelope.bodyOut
= request;
//
AndroidHttpTransport androidHttpTrandsport = new AndroidHttpTransport(url);
// HttpTransportSE androidHttpTransport = new HttpTransportSE(url);
SoapObject result = null ;
try {
// web service请求
androidHttpTrandsport.call(SOAP_ACTION, envelope);
// 得到返回结果
Object temp = envelope.getResult();
response
= Boolean.parseBoolean(temp.toString());
}
catch (Exception ex){
throw ex;
}
return response;

}
}
}

以上验证程序需要访问网络,别忘了在AndroidManifest.xml加入<uses-permission android:name="android.permission.INTERNET" />

更多相关文章

  1. android 通信机制 socket
  2. Android之Broadcast, BroadcastReceiver(广播)
  3. Android主线程里不允许网络操作
  4. android Can't create handler inside thread that has not call
  5. Android中工作线程与主线程同步方式
  6. Android(安卓)关闭线程(转)
  7. Android仿QQ消息列表ListView滑动删除效果
  8. Android使用AsyncTask下载图片,最好使用WeakReference
  9. Android(安卓)主线程子线程执行关系

随机推荐

  1. android 事件处理机制
  2. Android中activity触摸操作dispatchTouch
  3. Android(安卓)boot process stub
  4. Android获取 应用程序大小,数据大小,缓存大
  5. Android内存泄漏分析
  6. android listview 右滑删除(android 项目
  7. WebRTC
  8. Android(安卓)获取View高度宽度
  9. widget入门
  10. Android(安卓)2.3的camera的虚拟对焦的去