Czy chcesz odzyskać adres e-mail osoby kontaktowej?
Austyn Mahoney
1
Nie, podstawowy adres e-mail urządzenia.
Brandon O'Rourke
Z urządzeniem z Androidem jest powiązany co najmniej jeden adres e-mail, prawda? Tego chciałbym.
Brandon O'Rourke
2
@ BrandonO'Rourke Czy masz na myśli „podstawowy adres e-mail urządzenia” jako powiązany z Android Market? Ponieważ istnieje różnica między identyfikatorem Gmaila powiązanym z Android Market a innymi wiadomościami e-mail. Spójrz na to pytanie stackoverflow.com/questions/10606976/…
Gaurav Agarwal
Odpowiedzi:
749
Można to zrobić na kilka sposobów, pokazanych poniżej.
Jako przyjacielskie ostrzeżenie zachowaj ostrożność i bezpośredni kontakt z użytkownikiem, mając do czynienia z kontem, profilem i danymi kontaktowymi. Jeśli niewłaściwie wykorzystasz adres e-mail użytkownika lub inne dane osobowe, mogą się zdarzyć złe rzeczy.
Możesz użyć AccountManager.getAccountslub, AccountManager.getAccountsByTypeaby uzyskać listę wszystkich nazw kont na urządzeniu. Na szczęście dla niektórych typów kont (w tym com.google) nazwy kont to adresy e-mail. Przykładowy fragment poniżej.
Począwszy od Androida 4.0 (Ice Cream Sandwich), możesz uzyskać adresy e-mail użytkownika, uzyskując dostęp do jego profilu. Dostęp do profilu użytkownika jest nieco ciężki, ponieważ wymaga dwóch uprawnień (więcej na ten temat poniżej), ale adresy e-mail są dość wrażliwymi fragmentami danych, więc jest to cena wstępu.
Poniżej znajduje się pełny przykład, który wykorzystuje CursorLoaderdo pobierania wierszy danych profilu zawierających adresy e-mail.
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;}}
Wymaga to zarówno uprawnień, jak READ_PROFILEi READ_CONTACTSuprawnień:
Mam podobne pytanie za pomocą Twojego kodu Jestem w stanie uzyskać wszystkie identyfikatory Gmaila powiązane z moim telefonem, ale chcę podstawowy. Znalazłem jedno rozwiązanie, takie jak gdy dodajemy więcej identyfikatorów poczty, aby zsynchronizować z telefonem, wchodzi w stos, jeśli otrzymuję 0 pozycję com.google id, otrzymuję podstawową, ponieważ wchodzi ona pierwsza i uzyskuję 0 pozycję w stosie . Oto mój kod Account Account [] account = AccountManager.get (this) .getAccountsByType („com.google”); Ciąg myEmailid = kont [0] .toString (); Log.d („Mój identyfikator e-maila, którego chcę”, myEmailid); wiem, że to nie jest właściwy sposób.
PiyushMishra
59
Metoda profilu jest bardzo wadliwa (moim zdaniem). Aplikacja, która chce / potrzebuje mojego adresu e-mail, nie jest wielką sprawą w porównaniu z aplikacją, która chce czytać wszystkie moje kontakty, ale już to zrobiłeś, więc oba wymagają tych samych uprawnień. Jako użytkownik nie potrafię odróżnić aplikacji, która będzie czytać moją wiadomość e-mail, od aplikacji, która będzie czytać moje ponad 500 kontaktów. To bardzo realny, praktyczny problem, ponieważ rośnie liczba aplikacji, które wykorzystują twoje kontakty!
Tom
3
@Muzikant To nie jest oficjalne oświadczenie, ale jest raczej mało prawdopodobne, aby to zmienić. Powiedziawszy to, „poprawnym” sposobem dostępu do adresów e-mail użytkownika jest metoda B. Jest to bardziej „oficjalne”, a fakt, że kryje się za nim pewne uprawnienia ciężkie, powinien wskazywać na wrażliwość, z jaką należy podejść do takich danych.
Roman Nurik,
15
Zgadzam się z @Tom w tej sprawie. Prośba o zgodę na dane wszystkich kontaktów w telefonie tylko dla imienia i nazwiska użytkownika jest absurdalna.
tasomaniac
3
Metoda B nie działa dla mnie w Androidzie 4.4, kopiując cały przykładowy kod. cursor.isAfterLast()zawsze zwraca true. Dowolny pomysł?
Pamiętaj, że wymaga to korzystania z usług gry i że w niektórych przypadkach wyświetli się okno dialogowe, w którym użytkownik będzie musiał wybrać konto.
programista Androida
Za pomocą AccountManager.newChooseAccountIntent () wykonaj to samo zadanie i nie wymaga biblioteki usług Play.
Denis,
Czy powoduje to wyświetlenie wyskakującego okienka dla użytkownika w celu uwierzytelnienia konta w kontekście najnowszej wersji Androida? Jeśli tak, w jaki sposób mogę to obejść dla urządzenia posiadającego tylko jedno konto?
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;}
Zauważ, że wymaga to android.permission.GET_ACCOUNTS, co zostało zdefiniowane jako „niebezpieczne” uprawnienie (wymaga żądania w czasie wykonywania): developer.android.com/reference/android/…
SagiLow 17.04.17
@SagiLow Jak sobie z tym poradziłeś? Nie chcę pytać użytkownika o kolejne pozwolenie, żeby go leniwie wpisać jego adres e-mail :)
kod
1
@codebased Nie zrobiłem ... o ile wiem, nie jest to możliwe.
SagiLow
2
manager.getAccountsByType („com.google”); nie działa z nowszymi wersjami Androida.
Android GET_ACCOUNTSostatnio się zablokował, więc niektóre odpowiedzi nie działały dla mnie. Mam to działa na Androidzie 7.0 z zastrzeżeniem, że Twoi użytkownicy muszą znosić okno uprawnień.
Nie różni się to od innych odpowiedzi i wygląda na to, że te nie działają dla mnie - najwyraźniej ponieważ w nowszych wersjach Androida to zwraca tylko konta powiązane z aplikacją i nie wymaga już pozwolenia.
<używa-pozwolenia android: nazwa = "android.permission.GET_ACCOUNTS" />
Keshav Gera
1
Odpowiedzi Uzyskaj konta nie zadziałały dla mnie (zwróć 0 kont) - i mogę potwierdzić, że wywołanie kodu w wywołaniu zwrotnym przycisku nie miało znaczenia.
csga5000,
Ten kod działa, ale ostatnio mam problem z czasem, więc sprawdź naszą stronę
Keshav Gera,
0
Dodaj tę pojedynczą linię do manifestu ( za pozwoleniem )
Odpowiedzi:
Można to zrobić na kilka sposobów, pokazanych poniżej.
Jako przyjacielskie ostrzeżenie zachowaj ostrożność i bezpośredni kontakt z użytkownikiem, mając do czynienia z kontem, profilem i danymi kontaktowymi. Jeśli niewłaściwie wykorzystasz adres e-mail użytkownika lub inne dane osobowe, mogą się zdarzyć złe rzeczy.
Metoda A: Użyj AccountManager (API poziom 5+)
Możesz użyć
AccountManager.getAccounts
lub,AccountManager.getAccountsByType
aby uzyskać listę wszystkich nazw kont na urządzeniu. Na szczęście dla niektórych typów kont (w tymcom.google
) nazwy kont to adresy e-mail. Przykładowy fragment poniżej.Pamiętaj, że wymaga to
GET_ACCOUNTS
pozwolenia:Więcej informacji na temat korzystania
AccountManager
można znaleźć w przykładowym kodzie Menedżera kontaktów w zestawie SDK.Metoda B: Użyj ContactsContract.Profile (API poziom 14+)
Począwszy od Androida 4.0 (Ice Cream Sandwich), możesz uzyskać adresy e-mail użytkownika, uzyskując dostęp do jego profilu. Dostęp do profilu użytkownika jest nieco ciężki, ponieważ wymaga dwóch uprawnień (więcej na ten temat poniżej), ale adresy e-mail są dość wrażliwymi fragmentami danych, więc jest to cena wstępu.
Poniżej znajduje się pełny przykład, który wykorzystuje
CursorLoader
do pobierania wierszy danych profilu zawierających adresy e-mail.Wymaga to zarówno uprawnień, jak
READ_PROFILE
iREAD_CONTACTS
uprawnień:źródło
cursor.isAfterLast()
zawsze zwraca true. Dowolny pomysł?Może to być przydatne dla innych:
Korzystanie z AccountPicker w celu uzyskania adresu e-mail użytkownika bez żadnych globalnych uprawnień oraz umożliwienie użytkownikowi bycia świadomym, autoryzacji lub anulowania procesu.
źródło
Chciałbym skorzystać z AccountPicker Androida , wprowadzonego w ICS.
A następnie poczekaj na wynik:
źródło
źródło
android.permission.GET_ACCOUNTS
, co zostało zdefiniowane jako „niebezpieczne” uprawnienie (wymaga żądania w czasie wykonywania): developer.android.com/reference/android/…Istnieje interfejs API Androida, który pozwala użytkownikowi wybrać adres e-mail bez potrzeby uzyskania pozwolenia. Spójrz na: https://developers.google.com/identity/smartlock-passwords/android/retrieve-hints
Spowoduje to wyświetlenie próbnika, w którym użytkownik może wybrać adres e-mail. Wynik zostanie dostarczony za
onActivityResult()
źródło
Niestety odpowiedź nie działa.
Spóźniłem się, ale oto rozwiązanie dla wewnętrznej aplikacji e-mail dla Androida, chyba że dostawca uri zmienił treść:
źródło
Jest to dość trudna rzecz w Androidzie i jeszcze tego nie zrobiłem. Ale może te linki mogą ci pomóc:
źródło
Użyj tej metody:
Pamiętaj, że wymaga to
GET_ACCOUNTS
pozwolenia:Następnie:
źródło
Sugerowane odpowiedzi nie będą już działać, ponieważ na Androida 8 wprowadzono nowe ograniczenie.
więcej informacji tutaj: https://developer.android.com/about/versions/oreo/android-8.0-changes.html#aaad
źródło
Android
GET_ACCOUNTS
ostatnio się zablokował, więc niektóre odpowiedzi nie działały dla mnie. Mam to działa na Androidzie 7.0 z zastrzeżeniem, że Twoi użytkownicy muszą znosić okno uprawnień.AndroidManifest.xml
MainActivity.java
źródło
Praca w systemie operacyjnym MarshMallow
źródło
Dodaj tę pojedynczą linię do manifestu ( za pozwoleniem )
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Następnie wklej ten kod do swojej aktywności
źródło