Подтвердить что ты не робот

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

Почему так происходит? Учетная запись, электронная почта и имя получены, но фото всегда сбой.

4b9b3361

Ответ 1

Согласно Документация Google - GoogleSignInAccount

public Uri getPhotoUrl()

Получает URL-адрес фотографии подписанного пользователя.

Возвращает

URL-адрес фотографии для учетной записи Google. Только не null, если requestProfile() настроен, и у пользователя есть профиль Google+ картина.

Пожалуйста, проверьте, имеет ли ваша учетная запись Google изображение профиля Google+ или нет.

P/S: иногда, если картинка профиля Google+ уже создана, но после добавления аккаунта Google на устройство, возможно, вам нужно удалить существующую учетную запись Google с вашего устройства, а затем повторно добавить.

Ответ 2

если acct.getPhotoUrl() возвращает null

означает, что ваша учетная запись google не связана с Google Plus.. Это не даст вам null, если у вас есть соответствующая учетная запись google plus

Решение:

Появится возможность получить null... Решение дается ниже

существует один веб-сервис, в котором вы получите свой imageurl

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

"id" вы получите метод вызова acct.getId() и API_KEY, который вы получите от своей консоли разработчика... убедитесь, что API_KEY - это браузерный ключ... не андроид или серверный ключ....

Включите 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=50",    "isDefault": false } }

Теперь вы получили свой url как imageUrl....

Теперь Smile Пожалуйста, продолжайте кодирование!!!

Ответ 3

Попробуйте этот код, я это его работа для вашей проблемы.

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);
    }
}

Ответ 4

if(acct.getPhotoUrl() == null){
    //set default image
} else {
    photo_url = acct.getPhotoUrl().toString(); //photo_url is String
}

Ответ 5

Если возможно, только вы скомпилируете эти сервисы воспроизведения версии в вашем 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();
}

Работает для меня!!

Ответ 6

Когда это случилось со мной в моем приложении для Android, я удалил учетную запись с устройства и вернул ее обратно; и это сработало. Изначально у меня не было фото в аккаунте. Затем я добавил один. Это было устройство под управлением Jellybean.

Ответ 7

Сталкивается с той же проблемой, что при получении photoURL и tokenID в нуль

Как @BNK уже объяснил, что может быть другой причиной (ами)

поэтому просто добавляю в него мое решение для того, кто сталкивается с той же проблемой (надеясь, что это поможет им)

При использовании кода ниже (написано на kotlin)

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

Я просто могу получить такую информацию, как "DisplayName", "Email", "FamilyName", "ID", за исключением photoUrl и tokenId

Поэтому я просто добавил requestIdToken в GSO Builder следующим образом:

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

В результате я могу получить всю информацию вместе с idToken и photoUrl.

Примечание. Пожалуйста, используйте "WebClientId" для requestIdToken(), который вы можете получить (https://console.developers.google.com/apis/credentials?project=).

enter image description here