Ngày nay, các thiết bị di động thường được trang bị máy thu GPS. Vì nhiều vệ tinh quay quanh trái đất, bạn có thể sử dụng máy thu GPS để tìm vị trí của mình một cách dễ dàng. Tuy nhiên, GPS yêu cầu một trời quang để làm việc và do đó không phải lúc nào cũng hoạt động trong nhà hoặc nơi các vệ tinh có thể xuyên thủng (như một đường hầm xuyên qua một ngọn núi).
Một cách hiệu quả khác để xác định vị trí của bạn là thông qua tam giác tháp di động. Khi di động Điện thoại được bật, nó liên tục tiếp xúc với các trạm cơ sở xung quanh nó. Bằng cách biết danh tính của các tháp di động, có thể dịch thông tin này vào một vị trí thực tế thông qua việc sử dụng các cơ sở dữ liệu khác nhau có chứa các bản sắc của tháp di động địa điểm. Ưu điểm của tam giác tháp di động là nó hoạt động trong nhà, không cần có được thông tin từ các vệ tinh. Tuy nhiên, nó không chính xác như GPS vì độ chính xác của nó phụ thuộc vào trên vùng phủ sóng tín hiệu chồng chéo, thay đổi khá nhiều. Tam giác tháp di động hoạt động tốt nhất trong khu vực đông dân cư, nơi các tháp di động nằm gần nhau.
Phương pháp thứ ba để xác định vị trí của bạn là dựa vào tam giác Wi-Fi. Thay vì kết nối với các tháp di động, thiết bị kết nối với mạng Wi-Fi và kiểm tra nhà cung cấp dịch vụ cơ sở dữ liệu để xác định vị trí được phục vụ bởi nhà cung cấp. Trong ba phương pháp được mô tả ở đây, Tam giác Wi-Fi là ít chính xác nhất.
Trong nền tảng Android, SDK cung cấp lớp LocationManager để giúp thiết bị xác định vị trí vật lý. Đoạn code sau minh chứng điều đó:
import java.io.IOException; import java.util.List; import java.util.Locale; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; import com.google.android.maps.Overlay; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Point; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.view.KeyEvent; import android.view.MotionEvent; import android.widget.Toast;
public class LBSActivity extends MapActivity { MapView mapView;
MapController mc; GeoPoint p;
LocationManager lm;
private class MapOverlay extends com.google.android.maps.Overlay {
//... }
/** Called when the activity is first created. */ @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapView); mapView.setBuiltInZoomControls(true); mapView.setSatellite(true); mapView.setTraffic(true); mc = mapView.getController(); /* String coordinates[] = {“1.352566007”, “103.78921587”}; double lat = Double.parseDouble(coordinates[0]); double lng = Double.parseDouble(coordinates[1]); p = new GeoPoint(
(int) (lat * 1E6), (int) (lng * 1E6)); mc.animateTo(p); mc.setZoom(13); */
//---geo-coding---
Geocoder geoCoder = new Geocoder(this, Locale.getDefault()); try {
//... }
//---Add a location marker---
MapOverlay mapOverlay = new MapOverlay(); List<Overlay> listOfOverlays = mapView.getOverlays(); listOfOverlays.clear();
listOfOverlays.add(mapOverlay); mapView.invalidate();
//---use the LocationManager class to obtain locations data---
lm = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
}
@Override
public void onResume() {
super.onResume();
//---request for location updates---
lm.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, locationListener); } @Override
public void onPause() {
super.onPause();
//---remove the location listener---
lm.removeUpdates(locationListener); }
private class MyLocationListener implements LocationListener {
public void onLocationChanged(Location loc) {
Toast.makeText(getBaseContext(),
“Location changed : Lat: “ + loc.getLatitude() +
“ Lng: “ + loc.getLongitude(), Toast.LENGTH_SHORT).show();
p = new GeoPoint(
(int) (loc.getLatitude() * 1E6), (int) (loc.getLongitude() * 1E6));
mc.animateTo(p);
mc.setZoom(18); }
}
public void onProviderDisabled(String provider) { }
public void onProviderEnabled(String provider) { }
public void onStatusChanged(String provider, int status, Bundle extras) {
} }
public boolean onKeyDown(int keyCode, KeyEvent event) {
//... }
@Override
protected boolean isRouteDisplayed() { //...
}
Thêm 2 dòng sau vào Androidmanifest.xml <?xml version=”1.0” encoding=”utf-8”?> <manifest xmlns:android=”http://schemas.android.com/apk/res/android” package=”net.learn2develop.LBS” android:versionCode=”1” android:versionName=”1.0” > <uses-sdk android:minSdkVersion=”14” /> <uses-permission android:name=”android.permission.INTERNET”/>
<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION”/>
<application android:icon=”@drawable/ic_launcher” android:label=”@string/app_name” > <uses-library android:name=”com.google.android.maps” /> <activity android:label=”@string/app_name” android:name=”.LBSActivity” > <intent-filter > <action android:name=”android.intent.action.MAIN” /> <category android:name=”android.intent.category.LAUNCHER” /> </intent-filter> </activity> </application> </manifest> Có thể sử dụng DDMS để xem kết quả
Hình 3.9. Kết quả xác định vị trí của thiết bị Có thể thay đổi vị trí của thiết bị thông qua DDMS