How to show google plus profile picture on navigation drawer?

匿名 (未验证) 提交于 2019-12-03 08:59:04

问题:

The below code is from github to log in via gmail in android app.I did some modification to show profile picture using volley. Its working fine. I just want to shows these things in navigation drawer.

Profile picture,name and email id.

I used the navigation drawer activity present in android studio. I just tried to send these things using bundle to send to another activity but failed.

        Drawable drawable=profilePhoto.getDrawable();         Bitmap bitmap= ((BitmapDrawable)drawable).getBitmap();         ByteArrayOutputStream baos = new ByteArrayOutputStream();         bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);         byte[] b = baos.toByteArray();         Intent intent3=new Intent(this,MainActivity.class);         intent3.putExtra("picture", b);         startActivity(intent3); 

and on receiving side

   Bundle extras = getIntent().getExtras();     byte[] b = extras.getByteArray("picture");     Bitmap bmp = BitmapFactory.decodeByteArray(b, 0,100);     ImageView image = (ImageView) findViewById(R.id.profilePhoto);     image.setImageBitmap(bmp); 

Any help will be great

         public class SignInActivity extends AppCompatActivity implements     GoogleApiClient.OnConnectionFailedListener,     View.OnClickListener {  private static final String TAG = "SignInActivity"; private static final int RC_SIGN_IN = 9001;  private GoogleApiClient mGoogleApiClient; private TextView mStatusTextView,textViewEmail; private ProgressDialog mProgressDialog; private NetworkImageView profilePhoto; private ImageLoader imageLoader;  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.googlesingin);      // Views     mStatusTextView = (TextView) findViewById(R.id.status);      textViewEmail = (TextView) findViewById(R.id.textViewEmail);    profilePhoto = (NetworkImageView) findViewById(R.id.profileImage);       // Button listeners     findViewById(R.id.sign_in_button).setOnClickListener(this);     findViewById(R.id.sign_out_button).setOnClickListener(this);     findViewById(R.id.disconnect_button).setOnClickListener(this);      // [START configure_signin]     // Configure sign-in to request the user's ID, email address, and basic     // profile. ID and basic profile are included in DEFAULT_SIGN_IN.     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)             .requestEmail()             .build();     // [END configure_signin]      // [START build_client]     // Build a GoogleApiClient with access to the Google Sign-In API and the     // options specified by gso.     mGoogleApiClient = new GoogleApiClient.Builder(this)             .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)             .addApi(Auth.GOOGLE_SIGN_IN_API, gso)             .build();     // [END build_client]      // [START customize_button]     // Customize sign-in button. The sign-in button can be displayed in     // multiple sizes and color schemes. It can also be contextually     // rendered based on the requested scopes. For example. a red button may     // be displayed when Google+ scopes are requested, but a white button     // may be displayed when only basic profile is requested. Try adding the     // Scopes.PLUS_LOGIN scope to the GoogleSignInOptions to see the     // difference.     SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in_button);     signInButton.setSize(SignInButton.SIZE_STANDARD);     signInButton.setScopes(gso.getScopeArray());     // [END customize_button] }  @Override public void onStart() {     super.onStart();      OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);     if (opr.isDone()) {         // If the user's cached credentials are valid, the OptionalPendingResult will be "done"         // and the GoogleSignInResult will be available instantly.         Log.d(TAG, "Got cached sign-in");         GoogleSignInResult result = opr.get();         handleSignInResult(result);     } else {         // If the user has not previously signed in on this device or the sign-in has expired,         // this asynchronous branch will attempt to sign in the user silently.  Cross-device         // single sign-on will occur in this branch.         showProgressDialog();         opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {             @Override             public void onResult(GoogleSignInResult googleSignInResult) {                 hideProgressDialog();                 handleSignInResult(googleSignInResult);             }         });     } }  // [START onActivityResult] @Override public void onActivityResult(int requestCode, int resultCode, Intent data) {     super.onActivityResult(requestCode, resultCode, data);      // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);     if (requestCode == RC_SIGN_IN) {         GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);         handleSignInResult(result);     } } // [END onActivityResult]  // [START handleSignInResult] private void handleSignInResult(GoogleSignInResult result) {     Log.d(TAG, "handleSignInResult:" + result.isSuccess());     if (result.isSuccess()) {         // Signed in successfully, show authenticated UI.         GoogleSignInAccount acct = result.getSignInAccount();         mStatusTextView.setText(getString(R.string.signed_in_fmt, acct.getDisplayName()));          textViewEmail.setText(acct.getEmail());         imageLoader = CustomVolleyRequest.getInstance(this.getApplicationContext())                 .getImageLoader();          imageLoader.get(acct.getPhotoUrl().toString(),                 ImageLoader.getImageListener(profilePhoto,                         R.mipmap.ic_launcher,                         R.mipmap.ic_launcher));          //Loading image         profilePhoto.setImageUrl(acct.getPhotoUrl().toString(), imageLoader);         updateUI(true);     } else {         // Signed out, show unauthenticated UI.         updateUI(false);     } } // [END handleSignInResult]  // [START signIn] private void signIn() {     Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);     startActivityForResult(signInIntent, RC_SIGN_IN); } // [END signIn]  // [START signOut] private void signOut() {     Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(             new ResultCallback<Status>() {                 @Override                 public void onResult(Status status) {                     // [START_EXCLUDE]                     updateUI(false);                     // [END_EXCLUDE]                 }             }); } // [END signOut]  // [START revokeAccess] private void revokeAccess() {     Auth.GoogleSignInApi.revokeAccess(mGoogleApiClient).setResultCallback(             new ResultCallback<Status>() {                 @Override                 public void onResult(Status status) {                     // [START_EXCLUDE]                     updateUI(false);                     // [END_EXCLUDE]                 }             }); } // [END revokeAccess]  @Override public void onConnectionFailed(ConnectionResult connectionResult) {     // An unresolvable error has occurred and Google APIs (including Sign-In) will not     // be available.     Log.d(TAG, "onConnectionFailed:" + connectionResult); }  private void showProgressDialog() {     if (mProgressDialog == null) {         mProgressDialog = new ProgressDialog(this);         mProgressDialog.setMessage(getString(R.string.loading));         mProgressDialog.setIndeterminate(true);     }      mProgressDialog.show(); }  private void hideProgressDialog() {     if (mProgressDialog != null && mProgressDialog.isShowing()) {         mProgressDialog.hide();     } }  private void updateUI(boolean signedIn) {     if (signedIn) {         findViewById(R.id.sign_in_button).setVisibility(View.GONE);         findViewById(R.id.sign_out_and_disconnect).setVisibility(View.VISIBLE);     } else {         mStatusTextView.setText(R.string.signed_out);          findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);         findViewById(R.id.sign_out_and_disconnect).setVisibility(View.GONE);     } }  @Override public void onClick(View v) {     switch (v.getId()) {         case R.id.sign_in_button:             signIn();             break;         case R.id.sign_out_button:             signOut();             break;         case R.id.disconnect_button:             revokeAccess();             break;     } }  public void skip(View view) {     Intent intent = new Intent(this, MainActivity.class);     startActivity(intent);     finish(); } 

回答1:

I agree with "a person" about using Piccaso or Glide.

You can refer to my following code using Piccaso:

private void handleSignInResult(GoogleSignInResult result) {         Log.d(TAG, "handleSignInResult:" + result.isSuccess());         if (result.isSuccess()) {             // Signed in successfully, show authenticated UI.             GoogleSignInAccount acct = result.getSignInAccount();             mStatusTextView.setText(getString(R.string.signed_in_fmt, acct.getDisplayName()));             // Views inside NavigationView's header             mUserTextView.setText(acct.getDisplayName());             mEmailTextView.setText(acct.getEmail());             Uri uri = acct.getPhotoUrl();             Picasso.with(mContext)                     .load(uri)                     .placeholder(android.R.drawable.sym_def_app_icon)                     .error(android.R.drawable.sym_def_app_icon)                     .into(mProfileImageView);             updateUI(true);         } else {             // Signed out, show unauthenticated UI.             updateUI(false);         }     } 

More details, please refer to my sample project at GitHub. Hope it helps!



回答2:

I would use Glide or Picasso to load the image URL, rather than passing a Bitmap around. If you do want the Bitmap locally, then you could write to disk and pass the image's URI to the next Activity, instead of passing a Bitmap.

So at this point:

Drawable drawable=profilePhoto.getDrawable(); Bitmap bitmap= ((BitmapDrawable)drawable).getBitmap(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] b = baos.toByteArray(); 

..after creating the byte[], you could write it to disk, then pass the URI to the next Activity. This would require a permission in your manifest if you aren't already using it.

https://github.com/bumptech/glide

http://square.github.io/picasso/



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!