Android – Định vị GPS

5/5 - (1 vote)

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()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:

Screenshot_2016-06-07-10-38-58

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

5 1 vote
Article Rating
Subscribe
Thông báo cho tôi qua email khi
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

6 Comments
Inline Feedbacks
View all comments
trọng nguyễn
trọng nguyễn
7 năm trước

anh có thể cho em xin file của project này được không ?
mail của em :nguyentrong.info@gmail.com

trọng nguyễn
trọng nguyễn
7 năm trước

Error:(9, 1) A problem occurred evaluating root project ‘MyApplication2’.
> Could not find method compile() for arguments [com.android.support:support-annotations:24.2.0] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

em gặp lỗi này,anh xem giúp em nha

trọng nguyễn
trọng nguyễn
7 năm trước

a làm project này trên eclipse hay android studio vậy

Hoàng
Hoàng
2 năm trước

anh ơi mình muốn lấy vị trí và đưa nó lên googlemap thì như thế nào ạ?

Last edited 2 năm trước by Hoàng