Một trong những tính năng độc nhất của các ứng dụng trên thiết bị di động là thiết bị định vị tọa độ. Hầu như những người sử dụng smartphone đều mang theo chúng bên mình mọi lúc mọi nơi. Android cung cấp các lớp cho phép chúng ta truy cập vào hệ tọa độ địa lý của thiết bị, từ đó chúng ta có thể dùng để hiển thị vị trí đó trên bản đồ, hoặc tính khoảng cách giữa 2 điểm trên mặt đất… Trong phần này chúng ta sẽ tìm hiểu cách lấy kinh độ (Longitude) và vĩ độ (Latitude) của thiết bị.
Chúng ta tạo một project mới. Trong project này chúng ta cần dùng 3 quyền sau đây:
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
ACCESS_MOCK_LOCATION
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.phocode" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"> <activity android:name="MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Trong file layout chúng ta thiết kế như sau:
<?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" > <Button android:id="@+id/getLocation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Get location" android:textSize="20sp" android:onClick="onClick"/> <TextView android:id="@+id/longitude" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Longitude: " android:textSize="20sp"/> <TextView android:id="@+id/latitude" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Latitude: " android:textSize="20sp"/> </LinearLayout>
Chúng ta thiết kế một Button
và 2 TextView.
Khi click vào Button
thì hiển thị kinh độ và vĩ độ lên 2 TextView. Tiếp
theo là lớp MainActivity:
package com.phocode; import android.app.Activity; import android.os.Bundle; import android.content.Context; import android.location.Location; import android.location.LocationManager; import android.location.LocationListener; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; private static final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; private LocationManager locationManager; private TextView longitude, latitude; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); longitude = (TextView) findViewById(R.id.longitude); latitude = (TextView) findViewById(R.id.latitude); locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new MyLocationListener()); } public void onClick(View view) { Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if(location != null) { longitude.setText("Longitude: " + String.valueOf(location.getLongitude())); latitude.setText("Latitude: " + String.valueOf(location.getLatitude())); } } private class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location location) { longitude.setText("Longitude: " + String.valueOf(location.getLongitude())); latitude.setText("Latitude: " + String.valueOf(location.getLatitude())); } @Override public void onStatusChanged(String s, int i, Bundle b) {} @Override public void onProviderDisabled(String s) {} @Override public void onProviderEnabled(String s) {} } }
Lớp MainActivity
sẽ chịu trách nhiệm lấy dữ liệu tọa độ và hiển thị lên màn hình.
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Đầu tiên chúng ta lấy một đối tượng LocationManager
thông qua phương thức getSystemService().
locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new MyLocationListener() );
Phương thức requestLocationUpdates()
có tác dụng “gắn” đối tượng LocationListener
vào đối tượng LocationManager.
Mục đích là để bắt các sự kiện thay đổi trạng thái của LocationManager.
Ở đây chúng ta định nghĩa lớp MyLocationListener
kế thừa từ giao diện LocationListener,
lớp MyLocationListener
được định nghĩa ở dưới.
Tham số GPS_PROVIDER
là tên nhà cung cấp tọa độ. MINIMUM_TIME_BETWEEN_UPDATES
là thời gian ngắn nhất để cập nhật lại tọa độ, ở đây là 1 giây. MINIMUM_DISTANCE_CHANGE_FOR_UPDATES
là khoảng cách thay đổi thấp nhất để cập nhật lại tọa độ, ở đây chúng ta định nghĩa là 1000m, tức là nếu chúng ta cầm máy đi được 1000 mét thì thực hiện cập nhật lại. Các phương thức cập nhật sẽ được gọi trong lớp MyLocationListener.
public void onClick(View view) { Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if(location != null) { longitude.setText("Longitude: " + String.valueOf(location.getLongitude())); latitude.setText("Latitude: " + String.valueOf(location.getLatitude())); } }
Phương thức onClick()
sẽ được gọi khi người dùng click vào Button.
Ở đây chúng ta lấy đối tượng Location
từ phương thức getLastKnownLocation()
trong đối tượng LocationManager.
Chúng ta có thể lấy kinh độ và vĩ độ từ lớp Location.
private class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location location) { longitude.setText("Longitude: " + String.valueOf(location.getLongitude())); latitude.setText("Latitude: " + String.valueOf(location.getLatitude())); } ... }
Cuối cùng chúng ta định nghĩa lớp MyLocationListener
có cài đặt giao diện LocationListener.
Giao diện này có 4 phương thức cần được override là onLocationChanged(), onStatusChanged(), onProviderDisabled()
và onProviderEnabled().
Ở đây chúng ta chỉ dùng đến phương thức onLocationChanged(),
phương thức này được gọi khi tọa độ của máy thay đổi, trong phương thức này chúng ta cũng chỉ làm công việc lấy kinh độ và vĩ độ để gán lên TextView.
Chạy ứng dụng chúng ta có giao diện như thế này:
Từ 2 thông số “khô khan” là kinh độ và vĩ độ, chúng ta có thể dùng dể hiển thị lên bản đồ (trong bài sau chúng ta sẽ học cách sử dụng bản đồ), tính khoảng cách giữa 2 điểm trên mặt đất, lấy địa chỉ dựa theo kinh độ và vĩ độ…v.v