November 30, 2010
最近因為和學弟妹們合作開發Android手機程式已經網頁程式。因為網頁程式(VB.net)我先進行開發了,目前已完成三分一了。而學弟妹們開始要進行手機程式的開發了,而他們必須鏈接到MS SQL Server中提取資料。而在這我便想使用Web Service將資料庫的資料傳送給他們。所以才進行了以下的研究,此次研究花了我不少時間總算將它完成了。以下為準備步驟:
- 首先Android如果要連接 .Net Web Service 可以通過 ksoap2 的API這個套件去做連接。使用過覺得蠻方便的。ksoap2 version2.5.2 的API可以到此下載,或到ksoap2 的官網下載最新版本。
- 下載完畢後將它匯入到你的專案中,如圖:

- 之後將您的Web Service準備好,本次例子是寫一個手機登入程式。所以在此我的Web Service程式碼如下:
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
' 若要允許使用 ASP.NET AJAX 從指令碼呼叫此 Web 服務,請取消註解下一行。
' <System.Web.Script.Services.ScriptService()> _ <WebService(Namespace:="http://12x.10x.8x.1xx/tpeg_weather/")> _ <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Public Class WebService
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function MemberLogin(ByVal UserName As String, ByVal Password As String) As Boolean
Return Membership.ValidateUser(UserName, Password)
End Function
End Class
- 接下來就是將ksoap 的 class lib import 到自己的手機程式內。
import org.ksoap2.*;
import org.ksoap2.serialization.*;
import org.ksoap2.transport.*;
import org.w3c.dom.Text;
- 接下來是整個完整的手機程式碼:
package bird.samplecallwebservice;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity; import android.content.Intent;
import android.os.Bundle; import android.view.View;
import android.widget.Button; import android.widget.EditText;
import android.widget.TextView;
public class SampleCallWebService extends Activity {
/** Called when the activity is first created. */
/** 宣告連接 Web Service的基本資料*/
private static final String NAMESPACE = "http://1xx.1xx.8x.6x/tpeg_weather/" ;
private static final String URL = " http://1xx.1xx.8x.6x/tpeg_weather/WebService.asmx";
/** 宣告呼叫 Web Service 中的Method,本例子呼叫的Method名為: MemberLogin*/
/** Method MemberLogin Input Type : (String,String)*/
/** Method MemberLogin Ouput Type : (Boolean)*/
private static final String MemberLogin_SOAP_ACTION = "http://1xx.1xx.8x.6x/tpeg_weather/MemberLogin";
private static final String METHOD_NAME2 = "MemberLogin";
private EditText et_id,et_pwd;
private Button btn_login;
private TextView tv_msg;
public Boolean MemberLogin(String str_id, String str_pwd){
Boolean Flag = false;
/** 將EditText中的值傳給 Web Service,以執行 MemberLogin(String UserName,String Password)*/
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME2);
request.addProperty("UserName", str_id);
request.addProperty("Password", str_pwd);
/** 設定呼叫 Web Service一些值*/
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
tv_msg = (TextView) findViewById(R.id.TextView03);
try
{
/** 開始呼叫 Web Service*/
androidHttpTransport.call(MemberLogin_SOAP_ACTION, envelope);
/** 得到回傳值,必須使用SoapPrimitive型態來儲存,本次宣告了一個Result(SoapPrimitive型態)來儲存回傳值*/
SoapPrimitive Result = (SoapPrimitive)envelope.getResponse();
/** 由於回傳值是SoapPrimitive型態,而我們需要的是Boolean值,所以在此做個轉換型態*/
Flag = Boolean.parseBoolean(Result.toString());
}
catch(Exception e)
{
tv_msg.setText(e.getMessage());
}
return Flag;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn_login = (Button) findViewById(R.id.Button01);
et_id = (EditText) findViewById(R.id.EditText01);
et_pwd = (EditText) findViewById(R.id.EditText02);
/** 當按下Login按鈕時,會呼叫上面寫好的MemberLogin函式,然後判斷回傳的Boolean。如果是True就跳到新的頁面,如果False就顯示帳號密碼輸入錯誤的信息*/
btn_login.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v){
String str_id, str_pwd;
str_id = et_id.getText().toString();
str_pwd = et_pwd.getText().toString();
if (MemberLogin(str_id,str_pwd)){
Intent intent = new Intent();
intent.setClass(SampleCallWebService.this, Success.class);
Bundle bundle = new Bundle(); bundle.putString("UserName", str_id);
intent.putExtras(bundle);
startActivity(intent);
}else{
tv_msg = (TextView) findViewById(R.id.TextView03);
tv_msg.setText("Invalid User Name or Password!");
et_id.setText("");
et_pwd.setText("");
}
}
});
}
- 當Web Service 驗證帳密都通過後會跳到新的畫面。其完整程式碼可按此下載
。




