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.

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()+ permissionGET_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