Android'in birincil e-posta adresini (veya e-posta adreslerinin listesini) nasıl alırsınız?
OS 2.0 ve üstü sürümlerde birden çok e-posta adresi desteği olduğunu biliyorum, ancak 2.0'ın altında cihaz başına yalnızca bir e-posta adresiniz olabilir.
Android'in birincil e-posta adresini (veya e-posta adreslerinin listesini) nasıl alırsınız?
OS 2.0 ve üstü sürümlerde birden çok e-posta adresi desteği olduğunu biliyorum, ancak 2.0'ın altında cihaz başına yalnızca bir e-posta adresiniz olabilir.
Yanıtlar:
Aşağıda gösterilen bunu yapmanın birkaç yolu vardır.
Dostça bir uyarı olarak, hesap, profil ve iletişim verileriyle uğraşırken kullanıcılara karşı dikkatli ve açık olun. Bir kullanıcının e-posta adresini veya diğer kişisel bilgilerini kötüye kullanırsanız, kötü şeyler olabilir.
Cihazdaki tüm hesap adlarının bir listesini almak için AccountManager.getAccountsveya tuşlarını kullanabilirsiniz AccountManager.getAccountsByType. Neyse ki, belirli hesap türleri (dahil com.google) için hesap adları e-posta adresleridir. Aşağıdaki örnek snippet.
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;
...
}
}
Bunun GET_ACCOUNTSizin gerektirdiğini unutmayın :
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Daha kullanımıyla ilgili AccountManagerbulunabilir İletişim Yöneticisi SDK'sında örnek kod.
Android 4.0'dan (Ice Cream Sandwich) itibaren profiline erişerek kullanıcının e-posta adreslerini alabilirsiniz. Kullanıcı profiline erişmek, iki izin gerektirdiğinden (aşağıda daha fazlası) biraz ağırdır, ancak e-posta adresleri oldukça hassas veri parçalarıdır, bu nedenle giriş ücreti budur.
Aşağıda, CursorLoadere-posta adreslerini içeren profil veri satırlarını almak için a kullanan tam bir örnek verilmiştir .
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;
}
}
Bu hem READ_PROFILEve hem de READ_CONTACTSizinleri gerektirir :
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
cursor.isAfterLast()her zaman true değerini döndürür. Herhangi bir fikir?
Bu başkaları için yararlı olabilir:
Kullanıcının e-posta adresini herhangi bir genel izin olmadan almak için AccountPicker'ı kullanma ve kullanıcının işlemi bilmesine, yetkilendirmesine veya iptal etmesine izin vermek.
Android'in ICS'de tanıtılan AccountPicker aracını kullanırdım .
Intent googlePicker = AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null);
startActivityForResult(googlePicker, REQUEST_CODE);
Ve sonra sonucu bekleyin:
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, 'tehlikeli' izin olarak tanımlanan (çalışma zamanı isteği gerektirir) şunu gerektirdiğine dikkat edin : developer.android.com/reference/android/…
Kullanıcının izne ihtiyaç duymadan e-posta adreslerini seçmesine izin veren bir Android API'si var. Bir göz atın: https://developers.google.com/identity/smartlock-passwords/android/retrieve-hints
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);
}
Bu, kullanıcının bir e-posta adresi seçebileceği bir seçici gösterecektir. Sonuç teslim edilecekonActivityResult()
Ne yazık ki kabul edilen cevap çalışmıyor.
Geç kaldım, ancak içerik uri sağlayıcı tarafından değiştirilmediği sürece dahili Android E-posta uygulaması için çözüm:
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;
}
Bu Android'de yapmak oldukça zor bir şey ve henüz yapmadım. Ama belki de bu bağlantılar size yardımcı olabilir:
Bu yöntemi kullanın:
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 "";
}
Bunun GET_ACCOUNTSizin gerektirdiğini unutmayın :
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Sonra:
editTextEmailAddress.setText(getUserEmail());
Android 8'den itibaren yeni bir kısıtlama olduğu için önerilen cevaplar artık çalışmaz.
daha fazla bilgi burada: https://developer.android.com/about/versions/oreo/android-8.0-changes.html#aaad
Android GET_ACCOUNTSson zamanlarda kilitlendi, bu nedenle bazı cevaplar benim için çalışmadı. Android 7.0'da bu çalışmayı kullanıcılarınızın izin iletişim kutusuna katlanmak zorunda oldukları uyarısı ile aldım.
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);
}
}
}
MarshMallow İşletim Sisteminde Çalışma
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);
}
}
});
Bu tek satırı manifest'e ekle ( izin için )
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Ardından bu kodu etkinliğinize yapıştırı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;
}