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ức | Mô 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.