I.Giới thiệu

JSR 179 là một gói tùy chọn javax.microedition.location được cung cấp để truy cập các thông tin dựa trên vị trí. Location API cung cấp một chuẩn cho các developer viết các ứng dụng di động dựa trên vị trí. Location API cung cấp thông tin về vị trí địa lý hiện tại của thiết bị. Nó có thể được sử dụng với nhiều profile J2ME.

1.Tính toán vị trí(Expressing Location)

Vị trí có thể được thực hiện trong điều kiện không gian hay mô tả text. Vị trí không gian được thực hiện theo dạng hệ thống tọa độ: vĩ độ(latitude) – kinh độ(longitude) – độ cao. Vĩ độ được tính 0-90 độ bắc hay độ nam của đường xích đạo, ngược lại kinh độ được tính 0-180 độ đông hay độ tây của kinh tuyến chính, đi qua Greenwich, Anh. Độ cao được tính bằng mét so với mực nước biển. Mô tả text được tính thông qua địa chỉ đường, thành phố, mã vùng…

2.Vị trí thiết bị(location device)

Ứng dụng có thể sử dụng các phương pháp sau đây để tính toán vị trí thiết bị:

  • Cell ID(sử dụng mạng điện thoại): phương pháp Cell ID tính toán dựa trên xác định các trạm BTS(Base Transceiver Station) kết nối với thiết bị. Độ sai số của cách tính này phụ thuộc vào kích thước của cell của thiết bị di động kết nối với BTS.
  • Hệ thống định vị toàn cầu GPS(Global Positioning System)(sử dụng vệ tinh): việc xác định bằng GPS thường là phương pháp chính xác nhất, tuy nhiên nó có một số nhược điểm, đó là nó đòi hỏi phần cứng(hardware) cao, tốn pin khi sử dụng và đòi khỏi thời tiết đẹp hay để thiết bị ở những nơi thoáng đảng để có thể kết nối với vệ tinh.
  • Bluetooth(xác định vị trí trong phạm vi hẹp): việc định vị bằng Bluetooth được thực hiện trong các phạm vi hẹp, chừng 10m, độ chính xác cao, tuy nhiên phương pháp này đòi hỏi thiết bị phải có hỗ trợ Bluetooth.

II.Tổng quan

Các tính năng chính của Location API là:

  • Vị trí: chứa các thông tin về vị trí thiết bị.
  • Các điểm mốc(landmark): tạo, chỉnh sửa, lưu trữ và lấy các điểm mốc.
  • Định hướng(orientation): chứa hướng của thiết bị.

Mô tả các lớp và giao diện trong gói javax.microedition.location:

Lớp Mô tả
AddressInfo Lớp này chứa đựng thông tin địa chỉ text về vị trí.
Coordinates Lớp này đại diện như tọa độ(vĩ độ – kinh độ).
Criteria Tiêu chí sử dụng cho việc lựa chọn nhà cung cấp location được xác định bởi các giá trị trong lớp này.
Landmark Lớp này đại diện cho một cột mốc, tức là địa điểm với một tên gọi.
LandmarkStore Lớp này cung cấp các phương thức để lưu trữ, xóa và nhận landmark từ một store landmark.
Location Đại diện cho một các tiêu chuẩn thông tin location cơ bản.
LocationProvider Bắt đầu từ điểm mà ứng dụng sử dụng các API này và đại diện cho một nguồn thông tin location.
Orientation Lớp này đại diện cho một định hướng vật lý.
QualifiedCoordinates Đại diện cho các tọa độ vĩ độ – kinh độ – độ cao.
Giao diện Mô tả
LocationListener Đại diện cho một listener để nhận các sự kiện kết hợp với một LocationProvider.
ProximityListener Đại diện cho một listener để các sự kiện kết hợp với các tọa độ đã được đăng ký.
Ngoại lệ Mô tả
LandmarkException Lỗi này được ném ra khi xử lý điểm mốc xả ra lỗi.
LocationException Lỗi này được ném ra khi một location API gặp lỗi.

III.Location

Các đặc điểm của location cung cấp vị trí và các thông tin liên quan đến thiết bị. Có 2 lớp Location và LocationProvider cung cấp các phương thức để chứa thông tin Location. Lớp Location trừu tượng hóa các thông tin cá nhân, bao gồm: timestamp, tọa độ, tính chính xác, tốc độ, course, thông tin và thông tin địa chỉ text.

Các bước sau đây dùng để chứa đựng thông tin thiết bị:

  • Xác định Criteria.
  • Thiết lập Criteria cho LocationProvider.
  • Nhận một thể hiện LocationProvider theo một Criteria.
  • Nhận đối tượng Location từ LocationProvider.
  • Nhận Coordinates từ Location.

Để chứa đựng thông tin Location, ứng dụng cần chứa đựng một thể hiện của LocationProvider từ một Criteria. LocationProvider là điểm bắt đầu của ứng dụng chứa thông tin Location. Ứng dụng có thể xác định Criteria cho một LocationProvider. Tùy thuộc vào ứng dụng để có thể xác định Criteria cho việc lựa chọn phương pháp Location. Criteria được sử dụng làm đối số cho phương thức factory LocationProvider

static LocationProvider getInstance(Criteria criteria)
Sử dụng LocationProvider, ứng dụng có thể lấy về đối tượng Location thông qua:

  • Sử dụng phương thức getLocation(int timeout)
  • Đăng ký listener để có được Location theo định kỳ.

Đối tượng Location chứa thông tin về địa điểm và tọa độ. Các thông tin đó bao gồm: sự chính xác, tốc độ, course và các thông tin về phương pháp định vị sử dụng cho vị trí, cộng với một địa chỉ tùy chọn văn bản.

Tọa độ được đại diện bởi một trong 2 lớp sau:

  • Đối tượng Coordinates đại diện cho một điểm gồm có: vĩ độ và kinh độ tính theo độ, và độ cao tính theo mét.
  • Đối tượng QualifiedCoordinates có chứa vĩ độ, kinh độ, độ cao và chỉ dẫn chính xác của chúng chẳng hạn như bán kính của khu vực.

Địa chỉ văn bản được đại diện bởi lớp AddressInfo. AddressInfo chứa đựng thông tin các thông tin text về location. Nó có các phương thức getter và setter để thiết lập và nhận dữ liệu dựa trên các trường constant, chẳng hạn như: mã vùng, tiểu bang, thành phố, đường, số điện thoại…

1.Sử dụng phương thức getLocation()

Đoạn code ví dụ dưới đây sẽ mô tả cách thức để chứa một đối tượng Location sử dụng phương thức getLoacation():

...
/*Set criteria for selecting a location provider:
 accurate to 500 meters horizontally*/
Criteria cr= new Criteria();
cr.setHorizontalAccuracy(500);

/*Get an instance of the provider*/
LocationProvider lp= LocationProvider.getInstance(cr);

/*Request the location, setting a one-minute timeout*/
Location l = lp.getLocation(60);
Coordinates c = l.getQualifiedCoordinates();

if(c != null ) {
  /*Use coordinate information*/
  double lat = c.getLatitude();
  double lon = c.getLongitude();
}
...

2.Sử dụng Listener

Lớp LocationProvider có 2 phương thức để đăng ký listener để nhận các đối tượng Location thông qua:

  • LocationListener
    setLocationListener(LocationListener listener, int interval, int timeout, int maxAge)
  • ProximityListener
    addProximityListener(ProximityListener listener,                               Coordinates coordinates, float proximityRadius)

2.1.LocationListener

LocationListener cho phép cập nhật vị trí thường xuyên tại một khoảng thời gian tự định nghĩa. Nó có 2 phương thức:

  • locationUpdate(LocationProvider provider, Location location): phương thức này cho phép cập nhật vị trí định kỳ.
  • providerStateChanged(LocationProvider provider, int newState): cung cấp thông tin trạng thái của LocationProvider, chẳng hạn như: AVAILABLE, OUT_OF_SERVICE hay TEMPORARILY_UNAVAILABLE.

Ví dụ:

...
public void locationUpdated(LocationProvider provider, Location location){
 if (location != null && location.isValid()) {
   QualifiedCoordinates qc = location.getQualifiedCoordinates();
   form.append("Lat: "+qc.getLatitude()+
                    "Lon: "+qc.getLongitude()+"Alt: "+ qc.getAltitude()”);
    }
  }

public void providerStateChanged(LocationProvider provider,int newState){
form.append(“newState ”+newState)
}
...

2.2.ProximityListener

Ứng dụng có thể thêm ProximityListener để thông báo khi các tọa độ đã đăng ký được phát hiện. Listener này được gọi khi vạch giới hạn đi vào proximity của tọa độ đã được đăng ký. Nó có 2 phương thức:

  • proximityEvent(Coordinates coordinate, Location location): phương thức này được gọi khi người dùng đi vào một proximity một vị trí cụ thể.
  • monitoringStateChanged(boolean isMonitoringActive): phương thức này được gọi khi trạng thái của monitoring proximity thay đổi. Tham số isMonitoringActive cho biết trạng thái của monitoring proximity, nếu giá trị của nó là true có nghĩa là monitoring proximity đang được active, ngược lại nếu bằng false.

Ví dụ:

...
try
{                      
   Criteria cr = new Criteria();
   provider = LocationProvider.getInstance(cr);
   /* coordinates around which proximity has to be found*/
   Coordinates proximityCoordinates =
                                 new Coordinates(34.359766723, 60.495850625, 410);
   /*Listener registration for above coordinates for proximity of 2000 meters.*/
   LocationProvider.addProximityListener(this, proximityCoordinates, 2000.0f);
}
catch (LocationException e) {         
    e.printStackTrace();
}

/*ProxmityListener methods*/

public void proximityEvent(Coordinates arg0, Location arg1) {
form.append("You are presently within 2000 meters radius"+
                 "from Location Lat: 34.359766723 Long: 60.495850625" );              
}

public void monitoringStateChanged(boolean isActive)
{
   if(isActive)
            form.append(“Monitoring is Active”)
  else
            form.append(“Monitoring is currently not Active”)

}
...

Các bài liên quan:
Location API(JSR 179) trên J2ME - Phần 2