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

Cách mã hóa (encode) URL trong Android

Giới thiệu

Bài viết hướng dẫn mã hóa URL (URL Encoding) trong Android sử dụng java.net.URLEncoder. Mã hóa cần thiết khi URL chứa ký tự đặc biệt (khoảng trắng, tiếng Việt, ký tự Unicode...) để đảm bảo tuân thủ chuẩn RFC 3986.

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

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

Android Studio → File → New Project → Empty Activity.

Bước 2: Giao diện (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:padding="4dp"
    tools:context=".MainActivity">

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <Button
        android:id="@+id/btnEncode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:text="Tải URL" />
</RelativeLayout>

Bước 3: Logic (src/MainActivity.java)

import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class MainActivity extends AppCompatActivity {
    Button button;
    private WebView webView;
    String strURL;
    private String query;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = findViewById(R.id.webView);
        button = findViewById(R.id.btnEncode);

        // URL cơ sở
        strURL = "https://stackoverflow.com/search?q=";

        try {
            // Mã hóa query string: "android drawables" → "android+drawables" hoặc "android%20drawables"
            query = URLEncoder.encode("android drawables", "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        strURL += query;

        button.setOnClickListener(v -> {
            webView.setWebViewClient(new WebViewClient() {
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    super.onPageStarted(view, url, favicon);
                }

                @Override
                public void onPageFinished(WebView view, String url) {
                    Toast.makeText(getApplicationContext(), "Trang đã tải xong", Toast.LENGTH_SHORT).show();
                }
            });

            webView.getSettings().setJavaScriptEnabled(true);
            webView.loadUrl(strURL);
        });
    }
}

Bước 4: Manifest (Cần quyền INTERNET)

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

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

Chạy ứng dụng

Kết nối thiết bị, nhấn Run. Nhấn nút "Tải URL" → WebView mở StackOverflow tìm kiếm "android drawables".

Cách mã hóa (encode) URL trong Android

Chi tiết về URLEncoder

// Mã hóa
String encoded = URLEncoder.encode("tìm kiếm tiếng việt", "UTF-8");
// Kết quả: "ti%E1%BA%BFm+ki%E1%BA%BFm+ti%E1%BA%BFng+vi%E1%BB%87t"

// Giải mã
String decoded = URLDecoder.decode(encoded, "UTF-8");
// Kết quả: "tìm kiếm tiếng việt"

Lưu ý quan trọng

  • Chỉ encode phần query/parameter, KHÔNG encode toàn bộ URL (sẽ làm hỏng scheme, domain, path)
  • URLEncoder dùng + cho khoảng trắng (theo application/x-www-form-urlencoded). RFC 3986 dùng %20. Cần thay thế nếu API server yêu cầu strict RFC.
  • Luôn dùng "UTF-8" làm charset
  • Bắt buộc try-catch UnsupportedEncodingException (checked exception)

Thư viện hiện đại hơn

  • OkHttp HttpUrl: HttpUrl.parse(baseUrl).newBuilder().addQueryParameter("q", "android drawables").build() - tự động encode
  • Retrofit @Query: Tự động encode parameter
  • Uri.Builder (Android SDK): Uri.parse(baseUrl).buildUpon().appendQueryParameter("q", "value").build()

Ví dụ dùng Uri.Builder (Khuyến nghị cho Android)

String baseUrl = "https://stackoverflow.com/search";
Uri uri = Uri.parse(baseUrl).buildUpon()
        .appendQueryParameter("q", "android drawables")
        .appendQueryParameter("sort", "votes")
        .build();

webView.loadUrl(uri.toString());
// Kết quả: https://stackoverflow.com/search?q=android+drawables&sort=votes