2010-01-21 26 views
380

Android'in birincil e-posta adresini (veya bir e-posta adresleri listesi) nasıl edinirsiniz?Android cihazının birincil e-posta adresi nasıl edinilir

Bu benim anlayışıma göre, OS 2.0+ üzerinde birden çok e-posta adresi için destek var, ancak 2.0'ın altında cihaz başına yalnızca bir e-posta adresiniz olabilir.

+0

bir iletişim e-posta adresi almak dışarı? –

+1

Hayır, aygıtın birincil e-posta adresi. –

+0

Bir Android cihazla ilişkilendirilmiş bir veya daha fazla e-posta adresi var mı? Ben de öyle isterdim. –

cevap

726

aşağıda gösterilen Bunu yapmak için çeşitli yollar vardır.

Kullanıcı dostu bir uyarı olarak, hesap, profil ve iletişim bilgileriyle çalışırken kullanıcıyı dikkatli ve ön tarafa taşıyın. Bir kullanıcının e-posta adresini veya diğer kişisel bilgilerini kötüye kullanırsanız, kötü şeyler olabilir.

Yöntem A: Kullanım AccountManager (API seviyesi 5 +) Cihazın üzerindeki tüm hesap adlarının bir listesini almak için AccountManager.getAccounts veya AccountManager.getAccountsByType kullanabilirsiniz

. Neyse ki, belirli hesap türleri için (com.google dahil), hesap adları e-posta adresleridir. Aşağıdaki örnek snippet. Bu GET_ACCOUNTS izin alınması gerektiğini

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; 
     ... 
    } 
} 

Not: AccountManager kullanımıyla ilgili

<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

Daha SDK'sında Contact Manager örnek kod bulunabilir.

Yöntem B: Kullanım ContactsContract.Profile (API seviyesi 14+) Android 4.0 (Ice Cream Sandwich) itibariyle

kullanıcının profilini erişerek kullanıcının e-posta adreslerini alabilirsiniz. Kullanıcı profiline erişmek, iki izin gerektirdiğinden biraz ağırdır (daha fazlası için), ancak e-posta adresleri oldukça hassas veri parçalarıdır, bu yüzden bu, kabulün fiyatıdır.

Aşağıda, e-posta adresleri içeren profil veri satırlarını almak için CursorLoader kullanan tam bir örnek verilmiştir.

<uses-permission android:name="android.permission.READ_PROFILE" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 
+3

Kodunuzu kullanarak benzer bir soruyu ele alabiliyorum Tüm gmail kimlikleri telefonumla ilişkilendirildi ama birincil olanı istiyorum. 0. com.google kimlik numaralarını alıyorumsa telefonla senkronize etmek için telefonla senkronize etmek üzere daha fazla posta kimliği eklediğimizden bir çözüm buldum, çünkü ilk girişi alıyorum ve bir yığında 0 konumunu aldım . İşte benim bazı kodum Hesap [] accounts = AccountManager.get (this) .getAccountsByType ("com.google"); \t \t String myEmailid = hesaplar [0] .toString(); \t \t Log.d ("İstediğim e-posta adresim", myEmailid); Doğru olmadığını biliyorum. – PiyushMishra

+0

birincil gmail kimliğini almayı öneren daha iyi bir yol. – PiyushMishra

+1

GET_ACCOUNTS gerçekten ağır bir izintir; Uygulamanın tüm e-posta adreslerine ek olarak Twitter ve Facebook hesaplarına erişmesine izin vereceğim. [Kullanıcının e-posta adresini almak için daha iyi bir yol yok mu?] (Http://stackoverflow.com/questions/6502017/getting-android-owners-email-address-nicely) –

49

Bu başkalarına yararlı olabilir: herhangi küresel izinleri olmadan

Using AccountPicker to get user's email address ve kullanıcı farkında olmamı sağlayan ve yetki veya

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_PROFILE ve READ_CONTACTS izinleri gerektiriyor süreci iptal et.

+1

Bu çok yardımcı bir cevaptır, bence bu tercih edilen seçenek olmalıdır ** Birincil E-posta ** genellikle Google Hesabı anlamına gelir. Bu da, Google Play ** ile bağlantılı olacaktır. ** –

20

Android'in ICS'de tanıtılan AccountPicker kullanmasını isterim.

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); 
    } 
} 
+1

oyun hizmetlerini kullanmak ve bazı durumlarda kullanıcının hesabı seçmesi için bir iletişim kutusu göstermesi. –

12
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; 
} 
+0

Güzel ve kolay bir yöntem Teşekkürler :) –

+1

Bu 'tehlikeli' izni olarak tanımlanan 'android.permission.GET_ACCOUNTS' gerektirir (çalışma zamanı isteği gerektirir): https://developer.android.com/reference/android/Manifest.permission .html # GET_ACCOUNTS – SagiLow

+0

@SagiLow Bunu nasıl ele aldınız? Ben başka bir izin için, sadece onun e-posta adresini girmek için tembel yapmak için kullanıcı sormak istemiyorum :) – codebased

5

Ne yazık ki kabul cevap çalışmıyor.

geciktim ama içerik uri sağlayıcısı tarafından değiştirilmediği sürece burada 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; 
} 
0

Çalışan marshmallow İşletim Sistemi

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 { 

// Daha sonra Zımba Şeridi

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


      } 
     } 
    }); 
+0

** ** –

İlgili konular