[解決済み] Android端末のプライマリeメールアドレスを取得する方法
質問
Androidの主要なメールアドレス(またはメールアドレスのリスト)を取得するにはどうすればよいですか?
OS2.0以上では複数のメールアドレスがサポートされていますが、2.0以下では1端末に1つのメールアドレスしか持てないと理解しています。
解決方法は?
以下に示すように、いくつかの方法があります。
アカウント、プロフィール、連絡先のデータを扱うときは、注意深く、率直にユーザーに伝えてください。ユーザーの電子メールアドレスやその他の個人情報を悪用すると、悪いことが起こる可能性があります。
方法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 のサンプルコードです。
方法B:使用する コンタクト契約書.プロファイル (APIレベル14以上)
Android 4.0(Ice Cream Sandwich)より、ユーザーのプロファイルにアクセスすることで、ユーザーのメールアドレスを取得できるようになりました。ユーザープロファイルへのアクセスは、2つのパーミッションが必要なので少し重いですが(詳細は後述)、メールアドレスはかなり機密性の高いデータなので、これは入場料と言えるでしょう。
以下は
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" />
関連
-
Android.mk:7: *** セパレータがありません。
-
gitlab 設定エラー。リモートリポジトリから読み込めなかったか、ホストキーの検証に失敗しました。
-
Android のパッケージングに失敗し、Android リソースのリンクに失敗したことを示すプロンプトが表示される
-
アンドロイドスタジオでJunitのエラー問題を解決する
-
Error:A problem occurred configuring project ':app'. > ビルドを見つけられませんでした。
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Androidで画面の大きさをピクセル単位で取得する方法
-
[解決済み] アプリケーションを終了することは嫌われますか?
-
[解決済み] AndroidでstartActivityForResultを管理する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
adb シェルがデバイスのオフラインを求めるプロンプトを表示する
-
プログラム "git.exe "を実行できない場合の正しい解決方法です。CreateProcessエラー=2
-
Google PlayデバイスはPlay保護機構の認証を受けていません。
-
android studioが "The activity must be exported or contain an intent-filter" と表示され実行される。
-
プロセス 'command 'F:\sdkbuild-tools', 26.0.2 AAAPT.exe' finished with non-zero exit value 1
-
Android Nで報告されたエラーを解決する: android.os.FileUriExposedException: file:///storage/emulated/0/
-
Android ProgressBarの色を変更する
-
アンドロイドリストビュー
-
Android--shape--描画のコーナー、グラデーション、パディング、サイズ、ソリッド、ストロークのプロパティを指定する。
-
[解決済み] Androidでデフォルト/内蔵アプリを使わずにJavaMail APIを使ってメールを送信する