एंड्रॉइड डिवाइस का प्राथमिक ई-मेल पता कैसे प्राप्त करें


412

आपको एंड्रॉइड का प्राथमिक ई-मेल पता (या ई-मेल पते की सूची) कैसे मिलता है?

यह मेरी समझ है कि ओएस 2.0+ पर कई ई-मेल पतों के लिए समर्थन है, लेकिन 2.0 से नीचे आपको प्रति डिवाइस केवल एक ई-मेल पता हो सकता है।


क्या आप किसी संपर्क ईमेल पते को प्राप्त करने के बारे में बात कर रहे हैं?
ऑस्टिन महोनी

1
नहीं, डिवाइस का प्राथमिक ई-मेल पता।
ब्रैंडन ओ'रोरके

एंड्रॉइड डिवाइस के साथ एक या एक से अधिक ई-मेल पते जुड़े हैं? यही तो मैं चाहूंगा।
ब्रैंडन ओ'रोरके

2
@ BrandonO'Rourke क्या आपका मतलब है "डिवाइस का प्राथमिक ई-मेल पता" जो एंड्रॉइड मार्केट से जुड़ा है? क्योंकि एंड्रॉइड मार्केट और अन्य ईमेल से जुड़ी जीमेल आईडी में अंतर होता है। इस सवाल पर एक नजर डालते हैं stackoverflow.com/questions/10606976/…
गौरव अग्रवाल

जवाबों:


749

ऐसा करने के कई तरीके हैं, नीचे दिखाया गया है।

एक दोस्ताना चेतावनी के रूप में, खाते, प्रोफ़ाइल और संपर्क डेटा के साथ काम करते समय उपयोगकर्ता के लिए सावधान और सामने रहें। यदि आप किसी उपयोगकर्ता के ईमेल पते या अन्य व्यक्तिगत जानकारी का दुरुपयोग करते हैं, तो खराब चीजें हो सकती हैं।

विधि A: खाता प्रबंधक (API स्तर 5+) का उपयोग करें

आप डिवाइस पर सभी खाता नामों की सूची प्राप्त कर सकते हैं AccountManager.getAccountsया AccountManager.getAccountsByTypeउसका उपयोग कर सकते हैं । सौभाग्य से, कुछ खाता प्रकारों (सहित com.google) के लिए, खाते के नाम ईमेल पते हैं। नीचे उदाहरण स्निपेट।

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

ध्यान दें कि इसके लिए GET_ACCOUNTSअनुमति की आवश्यकता है :

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

उपयोग करने पर अधिक संपर्क प्रबंधकAccountManager से पाया जा सकता है एसडीके में नमूना कोड ।

विधि B: कॉन्टैक्टकंट्रेक्ट का उपयोग करें। फ़िल्टर (एपीआई स्तर 14+)

एंड्रॉइड 4.0 (आइसक्रीम सैंडविच) के रूप में, आप उपयोगकर्ता के ईमेल पते उनकी प्रोफ़ाइल पर पहुंचकर प्राप्त कर सकते हैं। उपयोगकर्ता प्रोफ़ाइल तक पहुंचना थोड़ा भारी है क्योंकि इसमें दो अनुमतियों की आवश्यकता होती है (नीचे उस पर अधिक), लेकिन ईमेल पते डेटा के संवेदनशील हिस्से हैं, इसलिए यह प्रवेश की कीमत है।

नीचे एक पूर्ण उदाहरण है जो CursorLoaderईमेल पतों वाली प्रोफाइल डेटा पंक्तियों को पुनः प्राप्त करने के लिए उपयोग करता है ।

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

इसके लिए अनुमति READ_PROFILEऔर READ_CONTACTSअनुमति दोनों चाहिए :

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

3
मैं अपने कोड का उपयोग करने के लिए इसी तरह का सवाल है मैं अपने फोन के साथ जुड़े सभी जीमेल आईडी प्राप्त करने में सक्षम हूं, लेकिन मुझे प्राथमिक चाहिए। मैंने एक समाधान पाया जैसे कि हम फोन के साथ सिंक्रनाइज़ करने के लिए अधिक मेल आईडी जोड़ते हैं, यह एक स्टैक में आता है अगर मुझे 0 वां स्थान मिल रहा है। आईओडी आईडी, मुझे प्राथमिक मिल रहा है क्योंकि यह पहले दर्ज करता है और स्टैक में 0 वां स्थान प्राप्त करता है। । यहाँ मेरे कुछ कोड अकाउंट [] अकाउंट्स = AccountManager.get (यह) .getAccountsByType ("com.google"); स्ट्रिंग myEmailid = खातों [0] .toString (); Log.d ("मेरी ईमेल आईडी जो मुझे चाहिए", myEmailid); मुझे पता है इसका सही तरीका नहीं है।
पीयूषमिश्रा

59
प्रोफ़ाइल विधि बुरी तरह से त्रुटिपूर्ण है (मेरी राय में)। एक ऐप जो मेरे ई-मेल को चाहता / चाहता है, वह उस ऐप की तुलना में कोई बड़ी बात नहीं है जो मेरे सभी संपर्कों को पढ़ना चाहता है, लेकिन आपने इसे ऐसा कर दिया है कि उन्हें दोनों को एक ही अनुमति की आवश्यकता है। इसलिए एक उपयोगकर्ता के रूप में, मैं अपने ई-मेल को पढ़ने जा रहे ऐप और मेरे 500+ संपर्कों को पढ़ने जा रहा ऐप के बीच अंतर नहीं बता सकता। यह बहुत ही वास्तविक, व्यावहारिक समस्या है क्योंकि आपके संपर्कों का दुरुपयोग करने वाले ऐप्स की संख्या बढ़ रही है!
टॉम

3
@Muzikant यह किसी भी तरह से एक आधिकारिक बयान नहीं है, लेकिन यह कुछ ऐसा है जो बदलने की संभावना नहीं है। यह कहने के बाद कि, उपयोगकर्ता के ईमेल पतों तक पहुँचने का "सही" तरीका है बी। वह अधिक "आधिकारिक" है और यह तथ्य कि यह कुछ हेवीवेट अनुमतियों के पीछे है, उस संवेदनशीलता को इंगित करना चाहिए जिसके साथ आपको ऐसे डेटा का उपयोग करना चाहिए।
रोमन नूरिक

15
मैं इस पर @Tom से सहमत हूं। उपयोगकर्ता के पहले और अंतिम नाम के लिए फोन पर सभी संपर्कों के डेटा की अनुमति मांगना हास्यास्पद है।
त्सोमोनिकिया

3
मेथड B एंड्रॉइड 4.4 में मेरे लिए काम नहीं कर रहा है सभी उदाहरण कोड की प्रतिलिपि बना रहा है। cursor.isAfterLast()हमेशा सच लौटता है। कोई उपाय?
cccrack

55

यह दूसरों के लिए उपयोगी हो सकता है:

बिना किसी वैश्विक अनुमति के उपयोगकर्ता का ईमेल पता प्राप्त करने के लिए अकाउंटपिकर का उपयोग करना , और उपयोगकर्ता को जागरूक होने और प्रक्रिया को अधिकृत या रद्द करने की अनुमति देना।


1
यह एक बहुत ही उपयोगी उत्तर है, मुझे लगता है कि यह पसंदीदा विकल्प होना चाहिए क्योंकि प्राथमिक ईमेल का आमतौर पर Google खाता होता है, जिसके बदले में आपको Google Play
Alex.F

@ एलेक्स। मार्शमॉलो के बाद / Android संस्करणों के लिए यह काम करता है?
इस्वर

27

मैं एंड्रॉइड के अकाउंटपिकर का उपयोग करूंगा , जिसे आईसीएस में पेश किया गया है।

Intent googlePicker = AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null);
startActivityForResult(googlePicker, REQUEST_CODE);

और फिर परिणाम की प्रतीक्षा करें:

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

2
ध्यान दें कि आपको प्ले-सेवाओं का उपयोग करने की आवश्यकता है, और यह कुछ मामलों में एक संवाद दिखाएगा, जिसमें उपयोगकर्ता को खाता चुनने की आवश्यकता होगी।
Android डेवलपर

AccountManager.newChooseAccountIntent () का उपयोग करके समान कार्य करें और इसके लिए प्ले-सर्विसेज लाइब्रेरी की आवश्यकता नहीं है।
डेनिस

क्या यह नवीनतम एंड्रॉइड वर्जन के संदर्भ में खाते के प्रमाणीकरण के लिए उपयोगकर्ता के लिए एक पॉप अप फेंकता है? यदि हाँ, तो मैं कैसे बाईपास करूँ कि डिवाइस के लिए केवल एक ही खाता हो?
इस्वर

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

अच्छी और आसान विधि धन्यवाद :)
तल्हा क्यू

2
इस पर ध्यान देना चाहिए android.permission.GET_ACCOUNTS, जिसे 'खतरनाक' अनुमति (रनटाइम अनुरोध की आवश्यकता है) के रूप में परिभाषित किया गया है: developer.android.com/reference/android/…
SagiLow

@SagiLow आपने इसे कैसे संभाला? मैं एक एक और अनुमति के लिए, उपयोगकर्ता पूछने के लिए नहीं करना चाहते हैं, बस उसे अपने ईमेल पता :) प्रवेश करने के लिए आलसी बनाने के लिए
codebased

1
@codebased मैं नहीं था ... यह संभव नहीं है जहाँ तक मुझे पता है।
सागीलोव

2
manager.getAccountsByType ( "com.google"); Android के बाद के संस्करणों के साथ काम नहीं करता है।
पाउडर 366

8

एक एंड्रॉइड एप है जो उपयोगकर्ता को बिना अनुमति के अपने ईमेल पते का चयन करने की अनुमति देता है। इस पर नज़र डालें: 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);
}

यह एक पिकर दिखाएगा जहां उपयोगकर्ता ईमेलड्रेस का चयन कर सकता है। में परिणाम दिया जाएगाonActivityResult()


मैं पुष्टि कर सकता हूं कि मैं इसका उपयोग करने में सक्षम था, एकमात्र काम के जवाब के लिए धन्यवाद, जो मैंने पाया है
csga5000

केवल काम कर समाधान, धन्यवाद wirling
Zulqarnain

7

दुख की बात है कि स्वीकृत जवाब काम नहीं कर रहा है।

मुझे देर हो गई है, लेकिन यहां आंतरिक एंड्रॉइड ईमेल एप्लिकेशन के लिए समाधान है जब तक कि प्रदाता द्वारा सामग्री यूरी को नहीं बदला जाता है:

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

6

यह Android में करने के लिए काफी मुश्किल काम है और मैंने इसे अभी तक नहीं किया है। लेकिन शायद ये लिंक आपकी मदद कर सकते हैं:


2

इस विधि का उपयोग करें:

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

ध्यान दें कि इसके लिए GET_ACCOUNTSअनुमति की आवश्यकता है :

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

फिर:

editTextEmailAddress.setText(getUserEmail());

यह केवल वर्तमान ऐप से जुड़े खातों को लौटाने के लिए लगता है - इसलिए मुझे परीक्षण में "कोई नहीं" मिला
csga5000

manager.getAccountsByType ("com.google") Android के बाद के संस्करणों में काम नहीं करता है। और क्या App.getInstance () से है?
पाउडर 366


0

एंड्रॉइड ने GET_ACCOUNTSहाल ही में बंद कर दिया, इसलिए मेरे कुछ जवाब मेरे काम नहीं आए। मुझे यह एंड्रॉइड 7.0 पर कैविएट के साथ काम कर रहा है जिसे आपके उपयोगकर्ताओं को अनुमति संवाद सहना पड़ता है।

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

यह अन्य उत्तरों से अलग नहीं है और यह मेरे जैसे काम नहीं कर रहा है - प्रतीत होता है क्योंकि एंड्रॉइड के नए संस्करणों में यह केवल ऐप से जुड़े खाते देता है और अब अनुमति की आवश्यकता नहीं है।
csga5000

0

मार्शमैलो ऑपरेटिंग सिस्टम में काम करना

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


            }
        }
    });

<उपयोग-अनुमति एंड्रॉइड: नाम = "android.permission.GET_ACCOUNTS" />
केशव गेरा

1
मेरे द्वारा काम नहीं किए गए खातों के जवाब प्राप्त करें (0 खाते लौटाएं) - और मैं पुष्टि कर सकता हूं कि एक बटन कॉलबैक में कोड को कॉल करने से कोई फर्क नहीं पड़ा।
csga5000

यह कोड काम कर रहा है, लेकिन हाल ही में मेरे पास समय का मुद्दा है, इसलिए कृपया हमारे पक्ष की जांच करें
केशव गेरा

0

प्रकट में इस एकल पंक्ति को जोड़ें ( अनुमति के लिए )

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

फिर इस कोड को अपनी गतिविधि में पेस्ट करें

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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.