3

Google Plus Authentication と Firebase をいじっています。

現在、Android での基本的な認証の例に取り組んでいます。基本認証部分は github のコードで正常に動作しており、正常に動作しています。https://github.com/firebase/firebase-login-demo-android

メールアドレスを取得しようとすると、問題が発生します。何らかの理由で、authData オブジェクトに存在しないようです。

Google 認証に関する Firebase ドキュメントから:

getProviderData().get("email") - プロフィールに記載されている Google ユーザーのメインのメール アドレス。有効なメール アドレスが利用可能で、Google のemail許可がユーザーによって付与されている場合にのみ返されます。

activity_main.xml に textview を追加すると…………

次に、私のコード MainActivity.java で:

private void setAuthenticatedUser(AuthData authData) {
    if (authData != null) {
    /* Hide all the login buttons */
    ......
    mLoggedInStatusTextView.setVisibility(View.VISIBLE);
    mEmailTextView = (TextView) findViewById(R.id.email_textView);
    mEmailTextView.setText(authData.getProviderData().get("email").toString());
    mEmailTextView.setVisibility(View.VISIBLE);
    ......
}

エラーが表示されます: null オブジェクト参照で仮想メソッド 'java.lang.String java.lang.Object.toString()' を呼び出そうとしています

さらに、デバッグをオンにしたAndroid Studioでは、authDataオブジェクトを調べると、電子メールは設定されていませんが、他の値は-auth、provider、providerData、token、uid、expiresなどです...

メールアドレスの取得を除いて、すべてうまくいっているようです。追加の権限が必要かどうかはわかりません。私の AndroidManifest.xml ファイルには、次のものがあります。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />

私が読んだことから、GET_ACCOUNTS権限で十分である必要があります。Firebaseがそれを取得できないように見える理由について何か考えはありますか?

編集:さらに、ユーザー データを Firebase に保存できます https://www.firebase.com/docs/android/guide/user-auth.html#section-storing

if(authData.getProviderData().containsKey("email")) {
    map.put("displayName", authData.getProviderData().get("email").toString());
}

次に、このメールの値は常に空であるため、Google Plus からメールをまったく取得していません。

4

5 に答える 5

1

メールを含む追加のスコープをリクエストする必要があるようです。そのスコープを追加すると、 でメールにアクセスできるようになりますgetProviderData()

どうして

Android 用 Google+ サインインは、スコープのデフォルト セットをリクエストします。このセットには、デフォルトでは電子メールが含まれていません。

どのように

ここに記載されているように、スコープは を初期化するときに定義さGoogleApiClientます。電子メールの範囲を指定します。

mGoogleApiClient = new GoogleApiClient.Builder(this)
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .addApi(Plus.API)
    .addScope(Plus.SCOPE_PLUS_LOGIN)
    .addScope("email") // <-- This requests the email address
    .build();

ドキュメントには、一般的に使用されるGoogle+ ログイン スコープのリストも含まれています。

于 2015-01-06T23:21:00.683 に答える
1

今週、この問題に遭遇しました。必要なスコープを追加しても、ユーザーのメールにアクセスできませんでした。authData コールバックには、追加したスコープに関係なく、常に同じフィールドがありました。

私は試しましたが.addScope(new Scope("email")).addScope(new Scope("https://www.googleapis.com/auth/plus.profile.emails.read"))何も達成しませんでした。

ユーザーのメールを取得できた唯一の方法は、Google のonConnected方法を使用して、ユーザーのメールで問い合わせることでした。

if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {
        String email = Plus.AccountApi.getAccountName(mGoogleApiClient);
        Log.i("email", email);
    }
于 2015-02-08T19:21:46.257 に答える
0

次のように、Plus オブジェクトからユーザーのメールを取得できます。

if (mGoogleApiClient.isConnected()) {
    String email = Plus.AccountApi.getAccountName(mGoogleApiClient);
}
于 2015-08-31T16:55:30.340 に答える
0

getProviderData().get("email")ユーザーの電子メールを取得する以外の別の方法を使用できます。

String email = Plus.AccountApi.getAccountName(mGoogleApiClient);

これにより、ユーザーの電子メールアドレスが取得されます。 <uses-permission android:name="android.permission.GET_ACCOUNTS" />アクセス許可には十分なので、アクセス許可やスコープを追加する必要はありません。

于 2015-01-30T08:19:16.560 に答える