ログインしているプロフィールから写真を取得しようとしています。ただし、常に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
なぜそうなるのですか?アカウントに署名し、メールと名前を取得しましたが、写真は常に失敗します。
Googleのドキュメント-GoogleSignInAccount によると
パブリックUri getPhotoUrl()
ログインしているユーザーの写真のURLを取得します。
戻り値
googleアカウントの写真のURL。 requestProfile()が設定され、ユーザーがGoogle+プロフィール写真を持っている場合のみnull以外。
お使いのGoogleアカウントにGoogle+プロフィール写真があるかどうかを確認してください。
P/S:Google+プロフィール写真がすでに作成されているが、デバイスにGoogleアカウントを追加した後、デバイスからその既存のGoogleアカウントを削除する必要がある場合があります。 -追加
photoURLとtokenIDをnullとして取得するのと同じ問題に直面していました
@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 = )
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 ...として取得しました。
今すぐ笑顔でコーディングを続けてください!!!
これが私の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);
}
}
if(acct.getPhotoUrl() == null){
//set default image
} else {
photo_url = acct.getPhotoUrl().toString(); //photo_url is String
}
可能であれば、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();
}
私のために働く!