Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách lấy kinh độ (longitude) từ Network Provider trên Android

Giới thiệu

Lấy kinh độ (longitude) của thiết bị qua Network Provider. Tương tự lấy vĩ độ nhưng dùng location.getLongitude(). Cặp (latitude, longitude) xác định vị trí duy nhất trên Trái Đất.

Triển khai

Bước 1: Tạo dự án

Android Studio → New Project → Empty Activity.

Bước 2: Layout (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:gravity="center"
        android:lineSpacingExtra="8dp"
        tools:text="Kinh độ: 106.6297\nVĩ độ: 10.8231" />

</LinearLayout>

Bước 3: MainActivity.java

package com.example.myapplication;

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
import androidx.appcompat.app.AppCompatActivity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView textView;
    Location location;
    double longitude, latitude;

    @RequiresApi(api = Build.VERSION_CODES.P)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.text);

        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 101);
        }

        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == 101 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                    && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            updateCoordinates();
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onResume() {
        super.onResume();
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        updateCoordinates();
    }

    private void updateCoordinates() {
        if (location != null) {
            longitude = location.getLongitude();
            latitude = location.getLatitude();
            textView.setText(String.format("Kinh độ (Longitude): %.6f\nVĩ độ (Latitude): %.6f\n\nProvider: %s\nAccuracy: %.1fm\nTime: %d", 
                longitude, latitude, location.getProvider(), location.getAccuracy(), location.getTime()));
        } else {
            textView.setText("Chưa có vị trí\nĐang chờ GPS/Wi-Fi...");
        }
    }
}

Bước 4: Manifest

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

Hệ tọa độ địa lý

Ví dụ tọa độ Việt Nam

  • Hà Nội: 21.0285° N, 105.8542° E
  • TP.HCM: 10.8231° N, 106.6297° E
  • Đà Nẵng: 16.0544° N, 108.2022° E
  • Cần Thơ: 10.0452° N, 105.7469° E

Ứng dụng thực tế

  • Maps/Navigation: Hiển thị vị trí, chỉ đường
  • Weather: Dự báo thời tiết theo tọa độ
  • Geo-fencing: Kiểm tra vào/vùng khu vực
  • Tracking: Ghi log hành trình
  • AR/Location-based games: Pokémon GO style

Best Practice: FusedLocationProviderClient

// Cách hiện đại (Google Play Services)
FusedLocationProviderClient fused = LocationServices.getFusedLocationProviderClient(this);
fused.getLastLocation().addOnSuccessListener(location -> {
    if (location != null) {
        double lat = location.getLatitude();
        double lon = location.getLongitude();
        // Cập nhật UI
    }
});
Ưu điểm FusedLocationProvider: Tự chọn provider tối ưu (GPS/Network/Wi-Fi), API đơn giản, hỗ trợ callback, tiết kiệm pin, độ chính xác cao hơn.
Thành phầnKý hiệuPhạm viÝ nghĩa
Vĩ độLat / φ-90° đến +90°Bắc (+) / Nam (-) xích đạo
Kinh độLon / λ-180° đến +180°Đông (+) / Tây (-) tử độ Greenwich