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

Cách lấy địa chỉ email chính của thiết bị Android

Giới thiệu

Bài viết hướng dẫn lấy địa chỉ email chính (Google account) đã đăng nhập trên thiết bị Android sử dụng AccountManager và quyền GET_ACCOUNTS.

⚠️ Lưu ý quan trọng về quyền riêng tư

Từ Android 10 (API 29), Google hạn chế truy xuất danh sách tài khoản. Ứng dụng cần quyền đặc biệt hoặc phải dùng AccountManager.newChooseAccountIntent() để người dùng tự chọn tài khoản. Cách dưới đây chỉ hoạt động tốt trên Android 9 trở xuống hoặc thiết bị root.

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="8dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="24sp"
        android:textStyle="bold"
        android:textAlignment="center"
        android:text="Địa chỉ email chính: testemail@gmail.com" />
</RelativeLayout>

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

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.util.Patterns;
import android.widget.TextView;
import android.widget.Toast;

import java.util.regex.Pattern;

public class MainActivity extends AppCompatActivity {
    private Activity activity = MainActivity.this;
    private static final int PERMISSION_REQUEST_CODE = 1;
    TextView textView;

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

        textView = findViewById(R.id.textView);

        String wantPermission = Manifest.permission.GET_ACCOUNTS;
        if (!checkPermission(wantPermission)) {
            requestPermission(wantPermission);
        } else {
            getEmails();
        }
    }

    private void getEmails() {
        Pattern emailPattern = Patterns.EMAIL_ADDRESS;
        Account[] accounts = AccountManager.get(this).getAccounts();

        for (Account account : accounts) {
            if (emailPattern.matcher(account.name).matches()) {
                String TAG = "MainActivity";
                Log.d(TAG, String.format("%s - %s", account.name, account.type));
                textView.setText("Địa chỉ email chính: " + account.name);
                break; // Chỉ lấy email đầu tiên tìm thấy
            }
        }
    }

    private boolean checkPermission(String permission) {
        if (Build.VERSION.SDK_INT >= 23) {
            int result = ContextCompat.checkSelfPermission(activity, permission);
            return result == PackageManager.PERMISSION_GRANTED;
        }
        return true;
    }

    private void requestPermission(String permission) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
            Toast.makeText(activity, "Quyền truy cập tài khoản cho phép lấy email của bạn", Toast.LENGTH_LONG).show();
        }
        ActivityCompat.requestPermissions(activity, new String[]{permission}, PERMISSION_REQUEST_CODE);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                getEmails();
            } else {
                Toast.makeText(activity, "Quyền bị từ chối.", Toast.LENGTH_LONG).show();
            }
        }
    }
}

Bước 4: Manifest (androidManifest.xml)

<?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.GET_ACCOUNTS" />

    <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. Cấp quyền "Contacts" (GET_ACCOUNTS) khi được yêu cầu.

Cách lấy địa chỉ email chính của thiết bị Android

Giải pháp hiện đại (Android 10+)

Thay vì liệt kê tất cả account, hãy dùng Account Picker để người dùng tự chọn:

Intent intent = AccountManager.newChooseAccountIntent(
    null, null, new String[]{"com.google"}, false, null, null, null, null);
startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT);

Trong onActivityResult lấy email từ data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME).

Tóm tắt

  • Cách cũ: AccountManager.getAccounts() + permission GET_ACCOUNTS
  • Hạn chế: Android 10+ chặn liệt kê account
  • Khuyến nghị: Dùng Account Picker hoặc Google Sign-In API