web-dev-qa-db-ja.com

GoogleSignInAccount getPhotoUrl()はnullを返します

ログインしているプロフィールから写真を取得しようとしています。ただし、常にnullを返します。名前とメールの戻り値、写真でのみ問題。

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestProfile()
            .requestEmail()
            .build();
mGoogleApiClient = new GoogleApiClient.Builder(StartActivity.this)
            .enableAutoManage(StartActivity.this, StartActivity.this)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)   
            .build();
acct = gResult.getSignInAccount();
String name = acct.getDisplayName(); //okay, value != null
String email = acct.getEmail(); //okay, value != null
Uri photoUri = acct.getPhotoUrl() //not okay, value == null

なぜそうなるのですか?アカウントに署名し、メールと名前を取得しましたが、写真は常に失敗します。

15
llaerto

Googleのドキュメント-GoogleSignInAccount によると

パブリックUri getPhotoUrl()

ログインしているユーザーの写真のURLを取得します。

戻り値

googleアカウントの写真のURL。 requestProfile()が設定され、ユーザーがGoogle+プロフィール写真を持っている場合のみnull以外。

お使いのGoogleアカウントにGoogle+プロフィール写真があるかどうかを確認してください。

P/S:Google+プロフィール写真がすでに作成されているが、デバイスにGoogleアカウントを追加した後、デバイスからその既存のGoogleアカウントを削除する必要がある場合があります。 -追加

19
BNK

photoURLtokenIDnullとして取得するのと同じ問題に直面していました

@BNKはすでに他の原因になり得るものを説明していたので

したがって、同じ問題に直面している人のために、私の解決策をそれに追加するだけです(これが彼らを助けることを願っています)

以下のコードを使用しながら(kotlinで記述)

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build()

'DisplayName'、 'Email'、 'FamilyName'、 'ID'photoUrlおよびtokenId

したがって、 'requestIdToken'をGSOビルダーに次のように追加しました:

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestIdToken(resources.getString(R.string.googleAccountWebClientID)) // This line did the magic for me
            .build()

この結果、all情報を 'idToken'および 'とともにフェッチできますphotoUrl '

注:親切に 'WebClientId'を使用してくださいrequestIdToken()これは( https:// console .developers.google.com/apis/credentials?project =

enter image description here

3
A.R.

acct.getPhotoUrl()がnullを返す場合

あなたのグーグルアカウントがグーグルプラスに関連付けられていないことを意味します。適切なグーグルプラスアカウントを持っている場合、これはあなたにnullを与えません

解決:

Nullになる可能性があります...解決策は以下のとおりです

imageurlを取得する残りのWebサービスが1つあります

https://www.googleapis.com/plus/v1/people/ {id}?fields = image&key = {API_KEY}

「id」はacct.getId()メソッド呼び出しによって取得され、API_KEYは開発者コンソールから取得されます... API_KEYがブラウザキーであることを確認してください... Androidまたはサーバーではないことを確認してくださいキー....

デベロッパーコンソールでGoogle+ Plus APIを有効にします...

これで、上記のサービス経由でプロフィール画像を取得できます。

https://www.googleapis.com/plus/v1/people/ {id}?fields = image&key = {API_KEY}

以下のような応答が得られます

{"image":{"url": " https://lh4.googleusercontent.com/-StnGV_eLi3s/AAAAAAAAAAI/AAAAAAAABHU/XLH5wQ_Rm9E/photo.jpg?sz=5 "、 "isDefault": false}}

これで、URLをimageUrl ...として取得しました。

今すぐ笑顔でコーディングを続けてください!!!

3
Manoj Behera

これが私のAndroidアプリで発生したとき、私はデバイスからアカウントを削除して元に戻しましたが、それは機能しました。元々はアカウントに写真がありませんでした。それから、写真を追加しました。 Jellybeanを実行するデバイス。

このコードを試してみてくださいこれはあなたの問題の仕事です。

String _name;
@Override
public void onConnected(Bundle arg0) {
    Log.e(TAG, "onConnected");

    Plus.PeopleApi.loadVisible(mGoogleApiClient, null).setResultCallback(this);

    Person currentUser = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient);

    Log.e("USERNAME_Con",Plus.AccountApi.getAccountName(mGoogleApiClient));
    Log.e("USERNAME_Con",currentUser.getBirthday()+"   "+currentUser.getImage().getUrl()+"   "+currentUser.getId());
    String personPhotoUrl=currentUser.getImage().getUrl();

    if(currentUser!=null){

        String email=Plus.AccountApi.getAccountName(mGoogleApiClient);
        String id=currentUser.getId();
         _name=currentUser.getDisplayName();
        progressDialog = ProgressDialog.show(Form.this, "", "Loading...", true,false);
        logingoogle(email,id,_name);
    }

    personPhotoUrl = personPhotoUrl.substring(0,
            personPhotoUrl.length() - 2)
            + 400;

    Log.e("USER Image",""+personPhotoUrl);
    new LoadProfileImage().execute(personPhotoUrl);

    // Indicate that the sign in process is complete.
    mSignInProgress = STATE_DEFAULT;
}

      private class LoadProfileImage extends AsyncTask<String, Void, Bitmap> {
    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon11 = null;
        try {
            InputStream in = new URL(urldisplay).openStream();
            mIcon11 = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        camera=mIcon11;
        return mIcon11;
    }

    protected void onPostExecute(Bitmap result) {
   //    bmImage.setImageBitmap(result);
         setimage(camera);
    }
}
0
Destro
if(acct.getPhotoUrl() == null){
    //set default image
} else {
    photo_url = acct.getPhotoUrl().toString(); //photo_url is String
}
0
and dev

可能であれば、build.gradleでこのバージョンの再生サービスを使用してコンパイルするだけで、古い実装を次のように変更できます。

implementation 'com.google.Android.gms:play-services-auth:12.0.1'

その後、アクティビティの結果にこのアクションを実行できます。

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == RC_SIGN_IN) {
    GoogleSignInResult result =Auth.GoogleSignInApi.getSignInResultFromIntent(data);
    handleSignInResult(result);
  }
}

以下:

private void handleSignInResult(GoogleSignInResult result) {
  GoogleSignInAccount acct = result.getSignInAccount();
  email       =   acct.getEmail();
  first_name  =   acct.getDisplayName();
  pic_profile = acct.getPhotoUrl().toString();
}

私のために働く!