web-dev-qa-db-ja.com

Android電話のプライマリメールアカウントを取得します

私はプロジェクトに取り組んでおり、EditTextにユーザーのプライマリメールを自動的に入力する必要があります。プライマリメールをGooglePlayストアに関連付けられたメールと見なしています。私は this postを読み、それを実装しました、

メールIDを取得するためにAccountManagerクラスを使用している場合、その電話に追加されたすべてのメールIDを取得するため、それは不可能であり、AccountManagerによって返された最初のメールIDを取得するように言われますが、初めて電話に追加されたメールID。

つまり、test @ gmail.comを追加し、それをgoogle playにリンクしたとします。後で、test_new @ gmail.comを追加し、このアカウントをPlayストアに関連付けました。現在、このアカウントでPlayストアを使用しています。次のようにコードを書いた場合;

        Account[] accountList = AccountManager.get(this).getAccountsByType("com.google");
    Log.d("Play Store account:" , accountList[0].name);

ステートメントの予想される出力は[email protected]ですが、test @ gmail.comを取得しています

この問題を解決する方法はありますか?

私があなたのアイデアを提供するのを手伝ってください。

12
droidev

私が読んだ限りでは、AndroidにはプライマリメールIDの概念はありません。また、Playストアに関連付けられている電子メールIDを取得する方法はありません。つまり、すべてのGmail IDを取得し、最後のIDを取得しました。これは、メインのメールIDではありませんが、彼のデバイスに最初に追加されたGoogleアカウントである必要があります。そのため、通常の使用例では、ユーザーは最初に追加した電子メールIDで遊ぶことはありません。したがって、プライマリメールIDと見なすことができます。

9
droidev

@driodevに同意します。しかし、私は別のアプローチでそれを行いました。コードをコピーして貼り付けるだけです...私はこの質問に少し遅れて答えるかもしれませんが、これは将来多くの人に役立つことを保証します。実際、getAccount( "com.example")の文字列を変更するだけで、Androidデバイスで使用されるアカウントIDを取得できると思います)。コードは次のとおりです。

String User_EmailId = getEmiailID(getApplicationContext());

 private String getEmailID(Context context) {
    AccountManager accountManager = AccountManager.get(context);
    Account account = getAccount(accountManager);
    if (account == null) {
        return null;
    } else {
        return account.name;
    }
}

private static Account getAccount(AccountManager accountManager) {
    Account[] accounts = accountManager.getAccountsByType("com.google");
    Account account;
    if (accounts.length > 0) {
        account = accounts[0];
    } else {
        account = null;
    }
    return account;
}    

`

3
Mohammed Nathar

「Playストアに関連付けられている」アカウントは、Playアプリのアプリ設定にすぎません。あなたはそれを読むことができません。ユーザーは、testを使用するアプリと、test_newを使用するアプリをダウンロード/購入できます。

2
bryan

@ MohammedNatharの回答へのいくつかの追加。 Android 6.0以降では、このバージョンは偏執的であるため、権限をリクエストすることを忘れないでください。

マニフェスト:

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

リクエスト:

private void requestPermissions(Activity activity) {
    if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.GET_ACCOUNTS}, 101);
        return null;
    }
}

そして活動

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    boolean result = false;
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
        result = true;
    switch (requestCode) {
        case 101:
            if (result) Log.d(Constants.LOG, "Permission GET_ACCOUNTS granted");
            break;
    }
}

または、必要に応じて1つの「if」でそれを行うことができます。

ユーザーがemail_idを割り当てるたびに、Android Emailでカレンダーを作成します。したがって、上記の解決策がうまくいかない場合は、これをハックとして試すことができます。Calendarに関連付けられたEメールを見つけてください。これが役立つことを願っています。

    public String getCalendarIdAndEmail(Context c) {

    String projection[] = {"_id", "calendar_displayName"};
    //   Uri calendars = Uri.parse("content://com.Android.calendar/calendars");
    String calID = null;
    try {
        ContentResolver contentResolver = c.getContentResolver();

        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
            return calID;
        }
        Cursor managedCursor = contentResolver.query(CalendarContract.Calendars.CONTENT_URI, projection, CalendarContract.Calendars.VISIBLE + " = 1 AND " + CalendarContract.Calendars.IS_PRIMARY + "=1", null, CalendarContract.Calendars._ID + " ASC");
        if (managedCursor.getCount() <= 0) {
            managedCursor = contentResolver.query(CalendarContract.Calendars.CONTENT_URI, projection, CalendarContract.Calendars.VISIBLE + " = 1", null, CalendarContract.Calendars._ID + " ASC");
        } else {
            Log.d("getCount", "" + managedCursor.getCount());
        }

        if (managedCursor.moveToFirst()) {

            int nameCol = managedCursor.getColumnIndex(projection[1]);
            int idCol = managedCursor.getColumnIndex(projection[0]);
            do {
               String calName = managedCursor.getString(nameCol);
                calID = managedCursor.getString(idCol);
                //CalName is Email id you are looking for
                Log.e("tag", "calName " + calName + "____calId " + calID);

            } while (managedCursor.hasNext());//managedCursor.moveToNext());
            managedCursor.close();
        }
    } catch (Exception e) {
        Log.e("error", e.getMessage(););
    }
    return calID;
}
0
Prinkal Kumar