GoogleSignInAccount getPhotoUrl()返回null

时间:2015-11-26 06:00:45

标签: android google-signin google-profiles-api

尝试从已登录的个人资料中获取照片。但总是返回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

为什么会这样?帐户已签名,电子邮件和姓名已获得,但照片始终失败。

7 个答案:

答案 0 :(得分:19)

根据Google's documentation - GoogleSignInAccount

  

public Uri getPhotoUrl()

     

获取已登录用户的照片网址。

     

返回

     

Google帐户的照片网址。如果已配置requestProfile()且用户确实拥有Google+个人资料,则仅为非null   图片。

请检查您的Google帐户是否有Google+个人资料图片。

P / S:有时,如果已经创建了Google+个人资料图片,但是在您的设备中添加Google帐户之后,您可能需要从设备中删除现有的Google帐户,然后重新添加。

答案 1 :(得分:3)

如果acct.getPhotoUrl()返回null

表示您的Google帐户未与Google Plus相关联..如果您拥有正确的Google Plus帐户,则不会为空

解决方案:

将有机会获得null ...解决方案在下面给出

有一个休息网络服务,您将通过它获得您的图像

https://www.googleapis.com/plus/v1/people/ {ID}字段=图像&安培;关键= {} API_KEY

" ID"你将通过acct.getId()方法调用和API_KEY获得你将从你的开发者控制台获得...确保API_KEY是浏览器密钥....不是android或服务器密钥....

在开发者控制台中启用Google+ Plus api ...

现在,您可以通过以上服务电话获取您的个人资料图片。

https://www.googleapis.com/plus/v1/people/ {ID}字段=图像&安培;关键= {} API_KEY

您将得到如下的回复

{   "图像":{     " url":" https://lh4.googleusercontent.com/-StnGV_eLi3s/AAAAAAAAAAI/AAAAAAAABHU/XLH5wQ_Rm9E/photo.jpg?sz=50",     " isDefault":false   } }

现在你把你的网址作为imageUrl ....

现在微笑请继续编码!!!

答案 2 :(得分:0)

试试这段代码我这是为你的问题所做的工作。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果可能的话,您只能在自己的build中使用此版本的play服务进行编译。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();
}

为我工作!!

答案 5 :(得分:0)

在我的Android应用程序中发生这种情况时,我从设备上删除了该帐户,然后将其放回去;而且有效。本来我的帐户中没有照片。然后我加了一个。它是运行豆形软糖的设备。

答案 6 :(得分:0)

  

遇到 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'

注意:请对 requestIdToken()使用“ WebClientId” ,您可以从(https://console.developers.google.com/apis/credentials?project=

获得

enter image description here