How to get the Android device's primary e-mail address

后端 未结 12 2300
借酒劲吻你
借酒劲吻你 2020-11-21 13:30

How do you get the Android\'s primary e-mail address (or a list of e-mail addresses)?

It\'s my understanding that on OS 2.0+ there\'s support for multiple e-mail add

相关标签:
12条回答
  • 2020-11-21 13:42

    There is an Android api that allows the user to select their email address without the need for a permission. Take a look at: 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);
    }
    

    This will show a picker where the user can select an emailaddress. The result will be delivered in onActivityResult()

    0 讨论(0)
  • 2020-11-21 13:46

    There are several ways to do this, shown below.

    As a friendly warning, be careful and up-front to the user when dealing with account, profile, and contact data. If you misuse a user's email address or other personal information, bad things can happen.

    Method A: Use AccountManager (API level 5+)

    You can use AccountManager.getAccounts or AccountManager.getAccountsByType to get a list of all account names on the device. Fortunately, for certain account types (including com.google), the account names are email addresses. Example snippet below.

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

    Note that this requires the GET_ACCOUNTS permission:

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

    More on using AccountManager can be found at the Contact Manager sample code in the SDK.

    Method B: Use ContactsContract.Profile (API level 14+)

    As of Android 4.0 (Ice Cream Sandwich), you can get the user's email addresses by accessing their profile. Accessing the user profile is a bit heavyweight as it requires two permissions (more on that below), but email addresses are fairly sensitive pieces of data, so this is the price of admission.

    Below is a full example that uses a CursorLoader to retrieve profile data rows containing email addresses.

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

    This requires both the READ_PROFILE and READ_CONTACTS permissions:

    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    
    0 讨论(0)
  • 2020-11-21 13:46

    Working In MarshMallow Operating System

        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);
    
    
                }
            }
        });
    
    0 讨论(0)
  • 2020-11-21 13:48

    I would use Android's AccountPicker, introduced in ICS.

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

    And then wait for the result:

    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);
        }
    }
    
    0 讨论(0)
  • 2020-11-21 13:53

    Sadly accepted answer isn't working.

    I'm late, but here's the solution for internal Android Email application unless the content uri is changed by provider:

    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 讨论(0)
  • 2020-11-21 13:53

    The suggested answers won't work anymore as there is a new restriction imposed from android 8 onwards.

    more info here: https://developer.android.com/about/versions/oreo/android-8.0-changes.html#aaad

    0 讨论(0)
提交回复
热议问题