- Tải Android SDK từ trang http://developer.android.com/sdk/index.html
- Chọn gói Eclipse + ADT plugin phù hợp với máy tính của bạn
- Download ksoap từ trang http://code.google.com/p/ksoap2-android/source/browse/#svn%2Fm2-repo%2Fcom%2Fgoogle%2Fcode%2Fksoap2-android%2Fksoap2-android-assembly%2F2.4
- Bạn có thể chọn nhiều phiên bản khác nhau: ở trong ứng dụng này mình chọn phiên bản 2.4
- Download gói jar: ksoap2-android-assembly-2.4-jar-with-dependencies.jar
- Vào File → New → Mục Android → Ta chọn Android Application Project
- Đặt tên ứng dụng Android là KetQuaXoSoClient và tùy chỉnh như hình sau:
- Chọn Next, và Next để tiến hành cấu hình Launcher Icon
- Chọn Next
- Đặt tên cho Activity
- Chọn Finish
- Trong res/layout/activity_main ta thiết kết 3 spinner và một listview để lấy kết quả về:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray"
>
<Spinner
android:id="@+id/spDanhSachMien"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:prompt="@string/spinner_mien"
android:spinnerMode="dropdown"
/>
<Spinner
android:id="@+id/spDanhSachTinh"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/spDanhSachMien"
android:prompt="@string/spinner_ngay"
android:spinnerMode="dropdown"
/>
<Spinner
android:id="@+id/spDanhSachNgay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/spDanhSachTinh"
android:prompt="@string/spinner_tinh"
android:spinnerMode="dropdown"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_below="@+id/spDanhSachNgay"
>
<ListView
android:id="@+id/lvKetQua"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"
>
</ListView>
</LinearLayout>
</RelativeLayout>
- Trong res/value/string.xml tra khai báo như sau:
<resources>
<string name="app_name">Kết quả sổ xố</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">Kết quả sổ xố</string>
<string name="spinner_mien">Chọn miền</string>
<string name="spinner_tinh">Chọn Tỉnh/Thành Phố</string>
<string name="spinner_ngay">Chọn ngày xổ số</string>
</resources>
- Trong AndroidManifest.xml ta khai báo quyền sử dụng Internet
<?xml version="1.0" encoding="utf-8"?>
<manifest
...>
<uses-permission android:name="android.permission.INTERNET"
/>
...
</manifest>
- Thêm thư viện ksoap đã download ở bước chuẩn bị trên vào libs
package hcmute.kqxs.client;
import java.io.IOException;
import java.util.ArrayList;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;
import android.util.Log;
public class TienIch {
private static String METHOD_NAME_1
= "getDanhSachMien";
private static String METHOD_NAME_2
= "getDanhSachTinh";
private static String METHOD_NAME_3
= "getDanhSachNgay";
private static String METHOD_NAME_4
= "getDanhSachKetQua";
private static String NAMESPACE = "http://kqsx.hcmute";
private static String SOAP_ACTION_1
= NAMESPACE + METHOD_NAME_1;
private static String SOAP_ACTION_2
= NAMESPACE + METHOD_NAME_2;
private static String SOAP_ACTION_3
= NAMESPACE + METHOD_NAME_3;
private static String SOAP_ACTION_4
= NAMESPACE + METHOD_NAME_4;
private static final String URL = "http://192.168.42.108:8080/KetQuaXoSoServer/services/KetQuaXoSo?wsdl";
public
ArrayList<String> getDanhSachMien() {
SoapObject resultSoap
= null;
try {
SoapObject
request = new SoapObject(NAMESPACE, METHOD_NAME_1);
SoapSerializationEnvelope
envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet
= true;
envelope.setOutputSoapObject(request);
HttpTransportSE
androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION_1,
envelope);
resultSoap =
(SoapObject) envelope.bodyIn;// envelope.getResponse();
} catch (IOException e) {
} catch
(XmlPullParserException e) {
} catch (Exception e) {
}
ArrayList<String>
result = new ArrayList<String>();
for (int i = 0; i <
resultSoap.getPropertyCount(); i++) {
Log.i("ChuNT",
resultSoap.getProperty(i).toString());
result.add(resultSoap.getProperty(i).toString());
}
return result;
}
public
ArrayList<String> getDanhSachTinh(String tenMien) {
Log.i("ChuNT", "Hàm lấy danh
sách đang tìm kết quả từ dịnh vụ web cho "
+
tenMien);
SoapObject resultSoap
= null;
try {
SoapObject
request = new SoapObject(NAMESPACE, METHOD_NAME_2);
request.addProperty("tenMien", tenMien);
SoapSerializationEnvelope
envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet
= true;
envelope.setOutputSoapObject(request);
HttpTransportSE
androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION_2,
envelope);
resultSoap =
(SoapObject) envelope.bodyIn;// envelope.getResponse();
} catch (IOException e) {
} catch
(XmlPullParserException e) {
} catch (Exception e) {
}
ArrayList<String>
result = new ArrayList<String>();
for (int i = 0; i <
resultSoap.getPropertyCount(); i++) {
Log.i("ChuNT",
resultSoap.getProperty(i).toString());
result.add(resultSoap.getProperty(i).toString());
}
return result;
}
public
ArrayList<String> getDanhSachNgay(String tenMien, String tenTinh) {
SoapObject resultSoap
= null;
try {
SoapObject
request = new SoapObject(NAMESPACE, METHOD_NAME_3);
request.addProperty("tenMien", tenMien);
request.addProperty("tenTinh", tenTinh);
SoapSerializationEnvelope
envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet
= true;
envelope.setOutputSoapObject(request);
HttpTransportSE
androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION_3,
envelope);
resultSoap =
(SoapObject) envelope.bodyIn;// envelope.getResponse();
} catch (IOException e) {
} catch
(XmlPullParserException e) {
} catch (Exception e) {
}
ArrayList<String>
result = new ArrayList<String>();
for (int i = 0; i <
resultSoap.getPropertyCount(); i++) {
Log.i("ChuNT",
resultSoap.getProperty(i).toString());
result.add(resultSoap.getProperty(i).toString());
}
return result;
}
public
ArrayList<String> getDanhSachKetQua(String tenMien,
String tenTinh,
String ngayXoSo) {
SoapObject resultSoap
= null;
try {
SoapObject
request = new SoapObject(NAMESPACE, METHOD_NAME_4);
request.addProperty("tenMien", tenMien);
request.addProperty("tenTinh", tenTinh);
request.addProperty("ngayXoSo", ngayXoSo);
SoapSerializationEnvelope
envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE
androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION_4,
envelope);
resultSoap =
(SoapObject) envelope.bodyIn;// envelope.getResponse();
} catch (IOException e) {
} catch
(XmlPullParserException e) {
} catch (Exception e) {
}
ArrayList<String>
result = new ArrayList<String>();
for (int i = 0; i <
resultSoap.getPropertyCount(); i++) {
Log.i("ChuNT", resultSoap.getProperty(i).toString());
result.add(resultSoap.getProperty(i).toString());
}
return result;
}
}
- String URL = "http://192.168.42.108:8080/KetQuaXoSoServer/services/KetQuaXoSo?wsdl";để lưu đường dẫn cung cấp dịch vụ web.
- private String METHOD_NAME…Để lưu phương thức được cung cấp trong dịch vụ web
- private String NAMESPACE …Package và namespace được đảo ngược chuỗi
package hcmute.kqxs.client;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
public class MainActivity extends Activity {
Spinner spDanhSachMien;
Spinner spDanhSachTinh;
Spinner spDanhSachNgay;
ListView lvKetQua;
ArrayAdapter<String>
arrayAdapterMien;
ArrayAdapter<String>
arrayAdapterTinh;
ArrayAdapter<String>
arrayAdapterNgay;
ArrayAdapter<String>
arrayAdapterKetQua;
String tenMien;
String tenTinh;
String ngayXoSo;
@Override
public void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spDanhSachMien = (Spinner)
findViewById(R.id.spDanhSachMien);
spDanhSachTinh = (Spinner)
findViewById(R.id.spDanhSachTinh);
spDanhSachNgay = (Spinner)
findViewById(R.id.spDanhSachNgay);
lvKetQua = (ListView)
findViewById(R.id.lvKetQua);
arrayAdapterMien = new
ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item);
arrayAdapterTinh = new
ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item);
arrayAdapterNgay = new
ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item);
arrayAdapterKetQua = new
ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1);
spDanhSachMien.setAdapter(arrayAdapterMien);
spDanhSachTinh.setAdapter(arrayAdapterTinh);
spDanhSachNgay.setAdapter(arrayAdapterNgay);
lvKetQua.setAdapter(arrayAdapterKetQua);
arrayAdapterMien.add("Chọn miền xổ
số");
arrayAdapterTinh.add("Chọn tỉnh xổ
số");
arrayAdapterNgay.add("Chọn ngày xổ
số");
ArrayList<String>
temp = new
TienIch().getDanhSachMien();
for (String string :
temp) {
arrayAdapterMien.add(string);
}
spDanhSachMien.setOnItemSelectedListener(spDanhSachMienSelected);
spDanhSachTinh.setOnItemSelectedListener(spDanhSachTinhSelected);
spDanhSachNgay.setOnItemSelectedListener(spDanhSachNgaySelected);
}
OnItemSelectedListener spDanhSachMienSelected = new
OnItemSelectedListener() {
public void
onItemSelected(AdapterView<?> parent, View arg1,
int position, long arg3) {
tenMien =
parent.getItemAtPosition(position).toString();
Log.i("ChuNT", tenMien);
ArrayList<String>
temp = new
TienIch().getDanhSachTinh(tenMien);
spDanhSachTinh.setSelection(0);
spDanhSachNgay.setSelection(0);
arrayAdapterTinh.clear();
arrayAdapterTinh.add("Chọn tỉnh xổ
số");
for (String string :
temp) {
arrayAdapterTinh.add(string);
}
}
public void
onNothingSelected(AdapterView<?> arg0) {
}
};
OnItemSelectedListener spDanhSachTinhSelected = new
OnItemSelectedListener() {
public void
onItemSelected(AdapterView<?> parent, View arg1,
int position, long arg3) {
tenTinh =
parent.getItemAtPosition(position).toString();
Log.i("ChuNT", tenTinh);
ArrayList<String>
temp = new TienIch().getDanhSachNgay(tenMien,
tenTinh);
spDanhSachNgay.setSelection(0);
arrayAdapterNgay.clear();
arrayAdapterNgay.add("Chọn ngày xổ
số");
for (String string :
temp) {
arrayAdapterNgay.add(string);
}
}
public void
onNothingSelected(AdapterView<?> arg0) {
}
};
OnItemSelectedListener spDanhSachNgaySelected = new
OnItemSelectedListener() {
public void
onItemSelected(AdapterView<?> parent, View arg1,
int position, long arg3) {
ngayXoSo =
parent.getItemAtPosition(position).toString();
Log.i("ChuNT", ngayXoSo);
ArrayList<String>
temp = new
TienIch().getDanhSachKetQua(tenMien,
tenTinh, ngayXoSo);
arrayAdapterKetQua.clear();
for (String string :
temp) {
arrayAdapterKetQua.add(string);
}
}
public void
onNothingSelected(AdapterView<?> arg0) {
}
};
}
Thành dòng
private static final
String URL = "http://192.168.1.80:8080/KetQuaXoSoServer/services/KetQuaXoSo?wsdl";
Tổng
kết
Như vậy qua phần này mình đã hướng dẫn các bạn cách gọi một web service thông qua dịch vụ web
dùng SOAP để trả kết quả về dạng XML. Ta dùng thư viện mã nguồn mở KSOAP để gọi
web service đó.
Em đang làm phần này nhưng bi lối, anh có thể giúp em sửa lôi được không à
Trả lờiXóaCode của em đây :
package cong.org;
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.os.Bundle;
import android.view.Menu;
import android.widget.Toast;
public class MainActivity extends Activity {
static final String SOAP_ACTION = "urn:WebServiceControllerwsdl#getMembers";
private static final String METHOD_NAME = "getMembers";
private static final String NAMESPACE = "urn:WebServiceControllerwsdl";
private static final String URL = "http://berichmart.com.vn/service/webService/service";
// ham getMembers tra ve 1 mang cac doi tuong member
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// goi soap
try{
SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
Request.addProperty("username", "admin");
Request.addProperty("password", "admin");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(Request);
HttpTransportSE aht = new HttpTransportSE (URL);
aht.call(SOAP_ACTION, envelope); // chuong trinh bi loi nullpointer khi chay lenh này.
SoapPrimitive resultstring = (SoapPrimitive) envelope.getResponse();
Toast.makeText(getApplicationContext(), String.valueOf(resultstring).toString(), Toast.LENGTH_LONG).show();
} catch(Exception E) {
Toast.makeText(getApplicationContext(), "ERROR:" + E.getClass().getName().toString() + ": " + E.getMessage().toString(), Toast.LENGTH_LONG).show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
e phải nói là lỗi j, ở đâu mới được chứ. cứ đưa code z sao a bik?
Trả lờiXóaAnh cho em hỏi cái này với. Em có 1 phương thức tìm kiếm trong Webservice và gọi ra trong android. Khi em hiển thị kết quả ra TextView thì được. Sau đó em chuyển qua ListView thì lại bị lỗi. Đây là code chuyển ra Text
Trả lờiXóatry {
SoapObject request = new SoapObject(NAMESPACE2,METHOD_NAME2);
PropertyInfo pi = new PropertyInfo();
pi.setName("a");
pi.setValue(ma);
pi.setType(String.class);
request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true; envelope.setOutputSoapObject(request);
HttpTransportSE transport = new HttpTransportSE(URL);
transport.call(SOAP_ACTION2, envelope);
final Object response = envelope.getResponse();
TextView tv = (TextView) findViewById(R.id.show);
tv.setMovementMethod(new ScrollingMovementMethod());
tv.setText(respone.toString());
Còn đây là code hiển thị ra ListView:
try {
SoapObject request = new SoapObject(NAMESPACE2,METHOD_NAME2);
PropertyInfo pi = new PropertyInfo();
pi.setName("a");
pi.setValue(ma);
pi.setType(String.class);
request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE transport = new HttpTransportSE(URL);
transport.call(SOAP_ACTION2, envelope);
final SoapObject response = (SoapObject)envelope.getResponse();
try {
JSONArray jsonArray= new JSONArray(response.toString());
for (int i = 0; i < jsonArray.length(); i++) {
array.add(newSuKien(jsonArray.getJSONObject(i).getString("tenSuKien"),jsonArray.getJSONObject(i).getString("ThoiGian1")));
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
Anh xem giúp em với ạ. Em cám ơn
Cám ơn anh. Bài viết rất hay ạ. Tìm mãi trên mạng mới được bài viết này của anh :))
Trả lờiXóaAnh cho em hỏi nếu như mình muốn lấy hình ảnh hoặc video trên webservice sử dụng ksoap2 thì có lấy được không ạ. Muốn lấy được thì phải sửa code như thế nào ạ. Anh hướng dẫn cho em với ạ. Em cảm ơn anh rất nhiều ạ
Cái này a chưa thử, vì thấy k nên làm z. Tuy nhiên, nếu em muốn thì có thể thử bằng cách chuyển image qua binary roi gửi.
XóaChúc e thành công!
Vâng ạ. Em cảm ơn anh ạ. Em mong anh có thật nhiều bài viết về Android ạ để bọn em có thể học theo ạ.
XóaAnh ơi cho em hỏi bây giờ mình muốn gửi một đối tượng từ Android bằng KSoap tới một Webservice viết bằng .NET thì mình làm thế nào ạ?
Trả lờiXóa:( Em đang làm đề tài tới đây thì bí mà hạn nộp sắp tới nơi rồi :(
anh ơi giúp em với em có đoạn code gọi webservice php :
Trả lờiXóatry {
SoapObject soapclient = new SoapObject(NAMESPACE,METHOD_NAME);
//SoapObject parameters = new SoapObject(NAMESPACE, METHOD_NAME);
soapclient.addProperty("dv",21);
//soapclient.addProperty(METHOD_NAME,parameters);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(soapclient);
HttpTransportSE httpTransportSE = new HttpTransportSE(URL);
httpTransportSE.call(SOAP_ACTION, envelope);
SoapPrimitive res =(SoapPrimitive) envelope.getResponse();
//SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
//strRespone = envelope.getResponse().toString();
//Thread.currentThread().interrupt();
tv.setText("a"+res.toString());
//httpTransportSE.getConnection().disconnect();
} catch (Exception e) {
tv.setText(e.toString());
}
..
nhưng khí chạy nó báo lỗi : andoid.os.networkOnMainThreadException.
Anh xem sửa giúp em với e tìm mấy hum nay mà chưa sửa đc! TKS anh
anh ơi,em làm y như thế này nhưng nó chạy lên màn hình trắng rồi dừng lun,ko load được,
Trả lờiXóaem có sữa 1 chô là chỗ spinnerMode em bỏ dòng này đi vì nó báo lỗi ko tìm thấy thuộc tính này trong gói android
2 cái link
http://kqsx.hcmute
http://192.168.42.108:8080/KetQuaXoSoServer/services/KetQuaXoSo?wsdl
em ko vào được nên nó có ảnh hưởng gì đến project ko anh
chào anh, em làm theo y như anh, web service đã hoạt động nhưng app android lại báo lỗi trong log cat, a giúp em fix với ạ:
Trả lờiXóa01-23 11:03:14.281: E/AndroidRuntime(2318): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int org.ksoap2.serialization.SoapObject.getPropertyCount()' on a null object reference