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

Cách lấy mã bưu chính (postal code) từ Network Provider trên Android

Giới thiệu

Lấy mã bưu chính (zip code/postal code) của vị trí hiện tại thông qua Network Provider và Geocoder. Hữu ích cho ứng dụng giao hàng, tìm kiếm địa điểm, tự động điền form địa chỉ.

Các bước thực hiện

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

Android Studio → New Project → Empty Activity.

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

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

    <TextView
        android:id="@+id/text"
        android:textSize="30sp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

Bước 3: MainActivity.java

package com.example.myapplication;

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
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;
import java.io.IOException;
import java.util.List;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {
    TextView textView;
    Location location;
    List<Address> addresses;
    Geocoder geocoder;

    @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);
        geocoder = new Geocoder(this, Locale.getDefault());
    }

    @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;
            }
            fetchPostalCode();
        }
        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;
        }
        fetchPostalCode();
    }

    private void fetchPostalCode() {
        if (location == null) {
            textView.setText("Không có vị trí");
            return;
        }
        try {
            addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
            if (addresses != null && !addresses.isEmpty()) {
                Address address = addresses.get(0);
                String postalCode = address.getPostalCode();
                textView.setText("Mã bưu chính: " + (postalCode != null ? postalCode : "Không xác định"));
            } else {
                textView.setText("Không tìm thấy địa chỉ");
            }
        } catch (IOException e) {
            e.printStackTrace();
            textView.setText("Lỗi: " + e.getMessage());
        }
    }
}

Bước 4: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <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" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Kết quả

Màn hình hiển thị mã bưu chính (ví dụ: 100000 cho Hà Nội, 700000 cho TP.HCM).

Các trường địa chỉ hữu ích khác

Phương thứcMô tảVí dụ
getAddressLine(0)Địa chỉ đầy đủ dòng 1"123 Đường ABC, Phường 1, Quận 1, TP.HCM"
getLocality()Thành phố/Thị xã"Hồ Chí Minh"
getSubLocality()Quận/Huyện/Phường"Quận 1"
getAdminArea()Tỉnh/Thành phố trực thuộc TW"Hồ Chí Minh"
getSubAdminArea()Quận/Huyện"Quận 1"
getCountryName()Tên quốc gia"Vietnam"
getCountryCode()Mã quốc gia ISO"VN"
getFeatureName()Tên địa điểm/địa danh"Bến Thành Market"
getPostalCode()Mã bưu chính"700000"
Lưu ý: Network Provider độ chính xác ~100-1000m. Mã bưu chính có thể không chính xác nếu vị trí gần ranh giới. Nên dùng GPS (FusedLocationProvider) cho độ chính xác cao.