Cara mendapatkan alamat email utama perangkat Android
412
Bagaimana Anda mendapatkan alamat email utama Android (atau daftar alamat email)?
Saya memahami bahwa pada OS 2.0+ ada dukungan untuk beberapa alamat email, tetapi di bawah 2.0 Anda hanya dapat memiliki satu alamat email per perangkat.
Apakah Anda berbicara tentang mengambil alamat email kontak?
Austyn Mahoney
1
Tidak, alamat email utama perangkat.
Brandon O'Rourke
Ada satu atau lebih alamat email yang dikaitkan dengan perangkat Android, bukan? Itu yang saya inginkan.
Brandon O'Rourke
2
@ BrandonO'Rourke Maksud Anda "Alamat email primer perangkat" sebagai alamat yang terkait dengan Android Market? Karena ada perbedaan antara id gmail yang terkait dengan Android Market dan email lainnya. Lihat pertanyaan ini stackoverflow.com/questions/10606976/…
Gaurav Agarwal
Jawaban:
749
Ada beberapa cara untuk melakukan ini, ditunjukkan di bawah ini.
Sebagai peringatan yang bersahabat, berhati-hatilah dan terbuka untuk pengguna saat berurusan dengan akun, profil, dan data kontak. Jika Anda menyalahgunakan alamat email pengguna atau informasi pribadi lainnya, hal-hal buruk dapat terjadi.
Anda dapat menggunakan AccountManager.getAccountsatau AccountManager.getAccountsByTypeuntuk mendapatkan daftar semua nama akun di perangkat. Untungnya, untuk jenis akun tertentu (termasuk com.google), nama akun adalah alamat email. Cuplikan contoh di bawah ini.
Pada Android 4.0 (Ice Cream Sandwich), Anda bisa mendapatkan alamat email pengguna dengan mengakses profil mereka. Mengakses profil pengguna agak berat karena memerlukan dua izin (lebih lanjut tentang itu di bawah), tetapi alamat email adalah bagian data yang cukup sensitif, jadi ini adalah harga tiket masuk.
Di bawah ini adalah contoh lengkap yang menggunakan a CursorLoaderuntuk mengambil baris data profil yang berisi alamat email.
publicclassExampleActivityextendsActivityimplementsLoaderManager.LoaderCallbacks<Cursor>{publicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLoaderManager().initLoader(0,null,this);}@OverridepublicLoader<Cursor> onCreateLoader(int id,Bundle arguments){returnnewCursorLoader(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 +" = ?",newString[]{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");}@Overridepublicvoid onLoadFinished(Loader<Cursor> cursorLoader,Cursor cursor){List<String> emails =newArrayList<String>();
cursor.moveToFirst();while(!cursor.isAfterLast()){
emails.add(cursor.getString(ProfileQuery.ADDRESS));// Potentially filter on ProfileQuery.IS_PRIMARY
cursor.moveToNext();}...}@Overridepublicvoid onLoaderReset(Loader<Cursor> cursorLoader){}privateinterfaceProfileQuery{String[] PROJECTION ={ContactsContract.CommonDataKinds.Email.ADDRESS,ContactsContract.CommonDataKinds.Email.IS_PRIMARY,};int ADDRESS =0;int IS_PRIMARY =1;}}
Ini membutuhkan izin READ_PROFILEdan READ_CONTACTS:
Saya memiliki pertanyaan serupa menggunakan kode Anda. Saya bisa mendapatkan semua id gmail yang terkait dengan telepon saya tetapi saya ingin yang utama. Saya menemukan satu solusi seperti ketika kita menambahkan lebih banyak id surat untuk disinkronkan dengan telepon, ia masuk ke dalam tumpukan jika saya mendapatkan posisi ke-0 com.google id, saya mendapatkan yang utama karena masuk pertama dan memperoleh posisi ke-0 dalam tumpukan . Inilah beberapa kode saya Akun [] akun = AccountManager.get (ini) .getAccountsByType ("com.google"); String myEmailid = akun [0] .toString (); Log.d ("Id email saya yang saya inginkan", myEmailid); saya tahu ini bukan cara yang benar.
PiyushMishra
59
Metode profil cacat parah (menurut saya). Aplikasi yang ingin / membutuhkan email saya bukan masalah besar dibandingkan dengan aplikasi yang ingin membaca semua kontak saya, tetapi Anda membuatnya sehingga mereka berdua membutuhkan izin yang sama. Jadi sebagai pengguna, saya tidak bisa membedakan antara aplikasi yang akan membaca email saya, dan aplikasi yang akan membaca 500+ kontak saya. Ini adalah masalah yang sangat nyata dan praktis karena jumlah aplikasi yang menyalahgunakan kontak Anda bertambah!
Tom
3
@Muzikant Ini tidak berarti pernyataan resmi, tapi itu sesuatu yang tidak mungkin berubah. Karena itu, cara "benar" mengakses alamat email pengguna adalah Metode B. Itu lebih "resmi" dan fakta bahwa itu di belakang beberapa izin kelas berat harus menunjukkan sensitivitas yang dengannya Anda harus mendekati data tersebut.
Roman Nurik
15
Saya setuju dengan @Tom dalam hal ini. Meminta izin untuk data semua kontak di telepon hanya untuk Nama Depan dan Terakhir pengguna itu konyol.
tasomaniac
3
Metode B tidak berfungsi untuk saya di Android 4.4 menyalin semua kode contoh. cursor.isAfterLast()selalu mengembalikan true. Ada ide?
Ini adalah jawaban yang sangat membantu, saya pikir ini harus menjadi pilihan yang disukai karena Email Primer biasanya berarti Akun Google, yang pada gilirannya akan Anda miliki dalam hubungannya dengan Google Play
Alex.F
@ Alex.F Apakah ini berfungsi untuk versi android setelah / dari marshmellow?
Eswar
27
Saya akan menggunakan Android AccountPicker , yang diperkenalkan di ICS.
Perhatikan bahwa itu mengharuskan Anda untuk menggunakan layanan-bermain, dan bahwa itu akan menampilkan dialog dalam beberapa kasus, bahwa pengguna harus memilih akun.
Pengembang android
Menggunakan AccountManager.newChooseAccountIntent () melakukan pekerjaan yang sama dan tidak memerlukan pustaka layanan bermain.
Denis
Apakah ini menimbulkan pop up kepada pengguna untuk otentikasi akun dalam konteks versi android terbaru? Jika ya, bagaimana saya memotongnya untuk perangkat yang hanya memiliki satu akun?
Eswar
14
publicString getUsername(){AccountManager manager =AccountManager.get(this);Account[] accounts = manager.getAccountsByType("com.google");List<String> possibleEmails =newLinkedList<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];}returnnull;}
Perhatikan bahwa ini memerlukan android.permission.GET_ACCOUNTS, yang didefinisikan sebagai izin 'berbahaya' (memerlukan permintaan runtime): developer.android.com/reference/android/…
SagiLow
@ SagiLow Bagaimana Anda menangani ini? Saya tidak ingin meminta pengguna, untuk izin lain, hanya untuk membuatnya malas memasukkan alamat emailnya :)
kode
1
@berdasarkan saya tidak ... itu tidak mungkin sejauh yang saya tahu.
SagiLow
2
manager.getAccountsByType ("com.google"); tidak bekerja dengan versi Android yang lebih baru.
Android dikunci GET_ACCOUNTSbaru - baru ini sehingga beberapa jawaban tidak bekerja untuk saya. Saya dapat ini bekerja di Android 7.0 dengan peringatan bahwa pengguna Anda harus menanggung dialog izin.
Ini tidak berbeda dari jawaban lain dan sepertinya itu tidak bekerja untuk saya - sepertinya karena dalam versi Android yang lebih baru ini hanya mengembalikan akun yang terkait dengan aplikasi dan tidak lagi memerlukan izin.
<menggunakan-izin android: name = "android.permission.GET_ACCOUNTS" />
Keshav Gera
1
Dapatkan jawaban akun tidak berfungsi untuk saya (kembalikan 0 akun) - dan saya dapat mengonfirmasi bahwa memanggil kode dalam panggilan balik tombol tidak membuat perbedaan.
csga5000
Kode ini berfungsi tetapi baru-baru ini saya mempunyai masalah waktu jadi silakan periksa pihak kami
Keshav Gera
0
Tambahkan baris tunggal ini dalam manifes ( untuk izin )
Jawaban:
Ada beberapa cara untuk melakukan ini, ditunjukkan di bawah ini.
Sebagai peringatan yang bersahabat, berhati-hatilah dan terbuka untuk pengguna saat berurusan dengan akun, profil, dan data kontak. Jika Anda menyalahgunakan alamat email pengguna atau informasi pribadi lainnya, hal-hal buruk dapat terjadi.
Metode A: Gunakan AccountManager (API level 5+)
Anda dapat menggunakan
AccountManager.getAccounts
atauAccountManager.getAccountsByType
untuk mendapatkan daftar semua nama akun di perangkat. Untungnya, untuk jenis akun tertentu (termasukcom.google
), nama akun adalah alamat email. Cuplikan contoh di bawah ini.Perhatikan bahwa ini memerlukan
GET_ACCOUNTS
izin:Lebih lanjut tentang penggunaan
AccountManager
dapat ditemukan di kode sampel Contact Manager di SDK.Metode B: Gunakan KontakContract.Profile (API level 14+)
Pada Android 4.0 (Ice Cream Sandwich), Anda bisa mendapatkan alamat email pengguna dengan mengakses profil mereka. Mengakses profil pengguna agak berat karena memerlukan dua izin (lebih lanjut tentang itu di bawah), tetapi alamat email adalah bagian data yang cukup sensitif, jadi ini adalah harga tiket masuk.
Di bawah ini adalah contoh lengkap yang menggunakan a
CursorLoader
untuk mengambil baris data profil yang berisi alamat email.Ini membutuhkan izin
READ_PROFILE
danREAD_CONTACTS
:sumber
cursor.isAfterLast()
selalu mengembalikan true. Ada ide?Ini bisa bermanfaat bagi orang lain:
Menggunakan AccountPicker untuk mendapatkan alamat email pengguna tanpa izin global apa pun, dan memungkinkan pengguna untuk mengetahui dan mengotorisasi atau membatalkan proses.
sumber
Saya akan menggunakan Android AccountPicker , yang diperkenalkan di ICS.
Dan kemudian tunggu hasilnya:
sumber
sumber
android.permission.GET_ACCOUNTS
, yang didefinisikan sebagai izin 'berbahaya' (memerlukan permintaan runtime): developer.android.com/reference/android/…Ada api Android yang memungkinkan pengguna untuk memilih alamat email mereka tanpa perlu izin. Lihatlah: https://developers.google.com/identity/smartlock-passwords/android/retrieve-hints
Ini akan menampilkan pemilih di mana pengguna dapat memilih alamat email. Hasilnya akan dikirim dalam
onActivityResult()
sumber
Jawaban yang diterima dengan sedih tidak bekerja.
Saya terlambat, tapi inilah solusi untuk aplikasi Email Android internal kecuali konten uri diubah oleh penyedia:
sumber
Ini cukup sulit untuk dilakukan di Android dan saya belum melakukannya. Tapi mungkin tautan ini dapat membantu Anda:
sumber
Gunakan metode ini:
Perhatikan bahwa ini memerlukan
GET_ACCOUNTS
izin:Kemudian:
sumber
Jawaban yang disarankan tidak akan berfungsi lagi karena ada batasan baru yang diberlakukan dari Android 8 dan seterusnya.
info lebih lanjut di sini: https://developer.android.com/about/versions/oreo/android-8.0-changes.html#aaad
sumber
Android dikunci
GET_ACCOUNTS
baru - baru ini sehingga beberapa jawaban tidak bekerja untuk saya. Saya dapat ini bekerja di Android 7.0 dengan peringatan bahwa pengguna Anda harus menanggung dialog izin.AndroidManifest.xml
MainActivity.java
sumber
Bekerja Di Sistem Operasi MarshMallow
sumber
Tambahkan baris tunggal ini dalam manifes ( untuk izin )
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Kemudian tempel kode ini dalam aktivitas Anda
sumber