Làm thế nào để bạn có được địa chỉ e-mail chính của Android (hoặc danh sách các địa chỉ e-mail)?
Theo hiểu biết của tôi, trên OS 2.0 trở lên, có hỗ trợ cho nhiều địa chỉ email, nhưng dưới 2.0 bạn chỉ có thể có một địa chỉ email trên mỗi thiết bị.
Làm thế nào để bạn có được địa chỉ e-mail chính của Android (hoặc danh sách các địa chỉ e-mail)?
Theo hiểu biết của tôi, trên OS 2.0 trở lên, có hỗ trợ cho nhiều địa chỉ email, nhưng dưới 2.0 bạn chỉ có thể có một địa chỉ email trên mỗi thiết bị.
Câu trả lời:
Có một số cách để làm điều này, được hiển thị dưới đây.
Như một cảnh báo thân thiện, hãy cẩn thận và thẳng thắn với người dùng khi giao dịch với tài khoản, hồ sơ và dữ liệu liên hệ. Nếu bạn sử dụng sai địa chỉ email của người dùng hoặc thông tin cá nhân khác, điều tồi tệ có thể xảy ra.
Bạn có thể sử dụng AccountManager.getAccounts
hoặc AccountManager.getAccountsByType
để có danh sách tất cả tên tài khoản trên thiết bị. May mắn thay, đối với một số loại tài khoản nhất định (bao gồm com.google
), tên tài khoản là địa chỉ email. Đoạn trích dưới đây.
Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
Account[] accounts = AccountManager.get(context).getAccounts();
for (Account account : accounts) {
if (emailPattern.matcher(account.name).matches()) {
String possibleEmail = account.name;
...
}
}
Lưu ý rằng điều này cần có sự GET_ACCOUNTS
cho phép:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Có AccountManager
thể tìm hiểu thêm về cách sử dụng tại mã mẫu Trình quản lý liên hệ trong SDK.
Kể từ Android 4.0 (Ice Cream Sandwich), bạn có thể nhận địa chỉ email của người dùng bằng cách truy cập hồ sơ của họ. Truy cập hồ sơ người dùng hơi nặng nề vì nó yêu cầu hai quyền (nhiều hơn ở bên dưới), nhưng địa chỉ email là những phần dữ liệu khá nhạy cảm, vì vậy đây là giá nhập học.
Dưới đây là một ví dụ đầy đủ sử dụng một CursorLoader
để lấy các hàng dữ liệu hồ sơ có chứa địa chỉ email.
public class ExampleActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arguments) {
return new CursorLoader(this,
// Retrieve data rows for the device user's 'profile' contact.
Uri.withAppendedPath(
ContactsContract.Profile.CONTENT_URI,
ContactsContract.Contacts.Data.CONTENT_DIRECTORY),
ProfileQuery.PROJECTION,
// Select only email addresses.
ContactsContract.Contacts.Data.MIMETYPE + " = ?",
new String[]{ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE},
// Show primary email addresses first. Note that there won't be
// a primary email address if the user hasn't specified one.
ContactsContract.Contacts.Data.IS_PRIMARY + " DESC");
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
List<String> emails = new ArrayList<String>();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
emails.add(cursor.getString(ProfileQuery.ADDRESS));
// Potentially filter on ProfileQuery.IS_PRIMARY
cursor.moveToNext();
}
...
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
}
private interface ProfileQuery {
String[] PROJECTION = {
ContactsContract.CommonDataKinds.Email.ADDRESS,
ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
};
int ADDRESS = 0;
int IS_PRIMARY = 1;
}
}
Điều này đòi hỏi cả quyền READ_PROFILE
và READ_CONTACTS
quyền:
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
cursor.isAfterLast()
luôn luôn trả về đúng Bất kỳ ý tưởng?
Điều này có thể hữu ích cho những người khác:
Sử dụng AccountPicker để nhận địa chỉ email của người dùng mà không cần bất kỳ quyền toàn cầu nào và cho phép người dùng nhận biết và ủy quyền hoặc hủy quy trình.
Tôi sẽ sử dụng AccountPicker của Android , được giới thiệu trong ICS.
Intent googlePicker = AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null);
startActivityForResult(googlePicker, REQUEST_CODE);
Và sau đó chờ kết quả:
protected void onActivityResult(final int requestCode, final int resultCode,
final Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
}
}
public String getUsername() {
AccountManager manager = AccountManager.get(this);
Account[] accounts = manager.getAccountsByType("com.google");
List<String> possibleEmails = new LinkedList<String>();
for (Account account : accounts) {
// TODO: Check possibleEmail against an email regex or treat
// account.name as an email address only for certain account.type values.
possibleEmails.add(account.name);
}
if (!possibleEmails.isEmpty() && possibleEmails.get(0) != null) {
String email = possibleEmails.get(0);
String[] parts = email.split("@");
if (parts.length > 1)
return parts[0];
}
return null;
}
android.permission.GET_ACCOUNTS
, được xác định là quyền 'nguy hiểm' (yêu cầu yêu cầu thời gian chạy): developer.android.com/reference/android/
Có một api Android cho phép người dùng chọn địa chỉ email của họ mà không cần sự cho phép. Hãy xem tại: https://developers.google.com/identity/smartlock-passwords/android/retrieve-h gợi ý
HintRequest hintRequest = new HintRequest.Builder()
.setHintPickerConfig(new CredentialPickerConfig.Builder()
.setShowCancelButton(true)
.build())
.setEmailAddressIdentifierSupported(true)
.setAccountTypes(IdentityProviders.GOOGLE)
.build();
PendingIntent intent = mCredentialsClient.getHintPickerIntent(hintRequest);
try {
startIntentSenderForResult(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Could not start hint picker Intent", e);
}
Điều này sẽ hiển thị một bộ chọn trong đó người dùng có thể chọn một địa chỉ email. Kết quả sẽ được gửi trongonActivityResult()
Đáng buồn thay câu trả lời không hoạt động.
Tôi đến trễ, nhưng đây là giải pháp cho ứng dụng Email Android nội bộ trừ khi nhà cung cấp thay đổi nội dung uri:
Uri EMAIL_ACCOUNTS_DATABASE_CONTENT_URI =
Uri.parse("content://com.android.email.provider/account");
public ArrayList<String> GET_EMAIL_ADDRESSES ()
{
ArrayList<String> names = new ArrayList<String>();
ContentResolver cr = m_context.getContentResolver();
Cursor cursor = cr.query(EMAIL_ACCOUNTS_DATABASE_CONTENT_URI ,null,
null, null, null);
if (cursor == null) {
Log.e("TEST", "Cannot access email accounts database");
return null;
}
if (cursor.getCount() <= 0) {
Log.e("TEST", "No accounts");
return null;
}
while (cursor.moveToNext()) {
names.add(cursor.getString(cursor.getColumnIndex("emailAddress")));
Log.i("TEST", cursor.getString(cursor.getColumnIndex("emailAddress")));
}
return names;
}
Đây là điều khá khó để làm trong Android và tôi chưa làm được. Nhưng có lẽ những liên kết này có thể giúp bạn:
Sử dụng phương pháp này:
public String getUserEmail() {
AccountManager manager = AccountManager.get(App.getInstance());
Account[] accounts = manager.getAccountsByType("com.google");
List<String> possibleEmails = new LinkedList<>();
for (Account account : accounts) {
possibleEmails.add(account.name);
}
if (!possibleEmails.isEmpty() && possibleEmails.get(0) != null) {
return possibleEmails.get(0);
}
return "";
}
Lưu ý rằng điều này cần có sự GET_ACCOUNTS
cho phép:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Sau đó:
editTextEmailAddress.setText(getUserEmail());
Các câu trả lời được đề xuất sẽ không hoạt động nữa vì có giới hạn mới được áp dụng từ Android 8 trở đi.
thêm thông tin tại đây: https://developer.android.com/about/versions/oreo/android-8.0-changes.html#aaad
Android đã bị khóa GET_ACCOUNTS
gần đây vì vậy một số câu trả lời không hoạt động với tôi. Tôi đã làm việc này trên Android 7.0 với lời cảnh báo rằng người dùng của bạn phải chịu đựng một hộp thoại cho phép.
AndroidManifest.xml
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
MainActivity.java
package com.example.patrick.app2;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.accounts.AccountManager;
import android.accounts.Account;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.*;
public class MainActivity extends AppCompatActivity {
final static int requestcode = 4; //arbitrary constant less than 2^16
private static String getEmailId(Context context) {
AccountManager accountManager = AccountManager.get(context);
Account[] accounts = accountManager.getAccountsByType("com.google");
Account account;
if (accounts.length > 0) {
account = accounts[0];
} else {
return "length is zero";
}
return account.name;
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case requestcode:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
String emailAddr = getEmailId(getApplicationContext());
ShowMessage(emailAddr);
} else {
ShowMessage("Permission Denied");
}
}
}
public void ShowMessage(String email)
{
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
alertDialog.setTitle("Alert");
alertDialog.setMessage(email);
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Context context = getApplicationContext();
if ( ContextCompat.checkSelfPermission( context, android.Manifest.permission.GET_ACCOUNTS )
!= PackageManager.PERMISSION_GRANTED )
{
ActivityCompat.requestPermissions( this, new String[]
{ android.Manifest.permission.GET_ACCOUNTS },requestcode );
}
else
{
String possibleEmail = getEmailId(getApplicationContext());
ShowMessage(possibleEmail);
}
}
}
Làm việc trong hệ điều hành MarshMallow
btn_click=(Button) findViewById(R.id.btn_click);
btn_click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
int permissionCheck = ContextCompat.checkSelfPermission(PermissionActivity.this,
android.Manifest.permission.CAMERA);
if (permissionCheck == PackageManager.PERMISSION_GRANTED)
{
//showing dialog to select image
String possibleEmail=null;
Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
Account[] accounts = AccountManager.get(PermissionActivity.this).getAccounts();
for (Account account : accounts) {
if (emailPattern.matcher(account.name).matches()) {
possibleEmail = account.name;
Log.e("keshav","possibleEmail"+possibleEmail);
}
}
Log.e("keshav","possibleEmail gjhh->"+possibleEmail);
Log.e("permission", "granted Marshmallow O/S");
} else { ActivityCompat.requestPermissions(PermissionActivity.this,
new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.READ_PHONE_STATE,
Manifest.permission.GET_ACCOUNTS,
android.Manifest.permission.CAMERA}, 1);
}
} else {
// Lower then Marshmallow
String possibleEmail=null;
Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
Account[] accounts = AccountManager.get(PermissionActivity.this).getAccounts();
for (Account account : accounts) {
if (emailPattern.matcher(account.name).matches()) {
possibleEmail = account.name;
Log.e("keshav","possibleEmail"+possibleEmail);
}
Log.e("keshav","possibleEmail gjhh->"+possibleEmail);
}
}
});
Thêm dòng đơn này trong tệp kê khai ( cho phép )
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Sau đó dán mã này vào hoạt động của bạn
private ArrayList<String> getPrimaryMailId() {
ArrayList<String> accountsList = new ArrayList<String>();
try {
Account[] accounts = AccountManager.get(this).getAccountsByType("com.google");
for (Account account : accounts) {
accountsList.add(account.name);
Log.e("GetPrimaryMailId ", account.name);
}
} catch (Exception e) {
Log.e("GetPrimaryMailId", " Exception : " + e);
}
return accountsList;
}