Android 장치의 기본 전자 메일 주소를 가져오는 방법
Android의 기본 전자 메일 주소(또는 전자 메일 주소 목록)를 어떻게 얻습니까?
제가 알기로는 OS 2.0+에서는 여러 개의 이메일 주소를 지원하지만 2.0 이하에서는 기기당 하나의 이메일 주소만 가질 수 있습니다.
다음과 같이 여러 가지 방법으로 이 작업을 수행할 수 있습니다.
계정, 프로필 및 연락처 데이터를 처리할 때는 사용자에게 사전에 주의해야 합니다.사용자의 전자 메일 주소나 다른 개인 정보를 잘못 사용하면 나쁜 일이 발생할 수 있습니다.
방법 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
SDK의 Contact Manager 샘플 코드에서 확인할 수 있습니다.
방법 B: 연락처 계약을 사용합니다.프로파일(API 레벨 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" />
이것은 다른 사람들에게 유용할 수 있습니다.
계정 선택기를 사용하여 글로벌 권한 없이 사용자의 전자 메일 주소를 가져오고 사용자가 프로세스를 인식하고 승인 또는 취소할 수 있도록 허용합니다.
ICS에 도입된 안드로이드의 계정 선택기를 사용할 것입니다.
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);
}
}
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;
}
사용자가 허가 없이 전자 메일 주소를 선택할 수 있는 Android API가 있습니다.다음을 살펴보십시오. 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()
슬프게도 받아들여진 답변이 작동하지 않습니다.
늦었지만 공급자가 컨텐츠 uri를 변경하지 않는 한 내부 Android Email 애플리케이션에 대한 솔루션은 다음과 같습니다.
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;
}
이것은 안드로이드에서 하기에는 꽤 까다로운 일이고 나는 아직 그것을 하지 않았습니다.하지만 이러한 링크가 도움이 될 수도 있습니다.
다음 방법을 사용합니다.
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());
매니페스트에 이 한 줄 추가(권한용)
<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;
}
Android 8 이후부터는 새로운 제한이 있기 때문에 제안된 답변은 더 이상 작동하지 않을 것입니다.
자세한 내용은 https://developer.android.com/about/versions/oreo/android-8.0-changes.html#aaad 에서 확인하십시오.
Android 8 이상의 경우 -
1단계 - AndroidManifest.xml에 다음 코드 추가 -
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
2단계 - 런타임에 권한을 요청하는 다음 코드를 활동에 추가합니다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if ((ActivityCompat.checkSelfPermission(this, Manifest.permission.GET_ACCOUNTS) == PackageManager.PERMISSION_GRANTED) && (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED)) {
getGoogleAccounts();
}
else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.GET_ACCOUNTS, Manifest.permission.READ_CONTACTS}, 1);
//return false;
}
}
3단계 - onRequestPermissions 결과에 대한 코드 추가 -
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
getGoogleAccounts();
}
}
4단계 - 마지막으로 계정 관리자를 사용하여 계정을 검색하는 코드를 추가합니다.
private void getGoogleAccounts(){
AccountManager am = AccountManager.get(this); // "this" references the current Context
Account[] accounts = am.getAccountsByType("com.google");
for (Account acc : accounts){
System.out.println("http accounts " + acc);
}
}
안드로이드 8의 변경 사항은 다음 링크를 참조하십시오 - https://developer.android.com/about/versions/oreo/android-8.0-changes#aaad
를 차단했습니다.GET_ACCOUNTS
그래서 최근에 몇몇 대답들은 저에게 효과가 없었습니다.Android 7.0에서 사용자가 권한 대화 상자를 견뎌야 한다는 경고와 함께 이 작업을 수행했습니다.
Android Manifest.xml
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
기본 활동.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);
}
}
}
MarshMallow 운영 체제에서 작업
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);
}
}
});
언급URL : https://stackoverflow.com/questions/2112965/how-to-get-the-android-devices-primary-e-mail-address
'programing' 카테고리의 다른 글
Rails: OS X에 PG gem 설치 중 - 기본 확장 빌드 실패 (0) | 2023.06.01 |
---|---|
새 Android 단편을 인스턴스화하는 모범 사례 (0) | 2023.06.01 |
루비의 include와 require의 차이점은 무엇입니까? (0) | 2023.06.01 |
URL/전화로 클릭할 수 있는 UI 레이블을 만드는 방법은 무엇입니까? (0) | 2023.06.01 |
스피너 텍스트 크기와 텍스트 색상을 변경하는 방법은 무엇입니까? (0) | 2023.06.01 |