问题
Google plus login from one activity (this activity stored the login details in shared preference) and logout from another activity (this activity retreives the login details).Logout activity has the logout button. My issue:I need to login from first activity (AndroidGooglePlusExample) and the login details (username,userimage,emailid) are stored in shared preference. I retreive these values in second activity(HomePage), and display it there, and from this second activity I need to logout on clicking the logout button. Please help me to solve this issue .This is my login activity
public class AndroidGooglePlusExample extends Activity implements OnClickListener, ConnectionCallbacks, OnConnectionFailedListener {
private static final int RC_SIGN_IN = 0;
// Google client to communicate with Google
private GoogleApiClient mGoogleApiClient;
private boolean mIntentInProgress;
private boolean signedInUser;
private ConnectionResult mConnectionResult;
private SignInButton signinButton;
private ImageView image;
private TextView username, emailLabel;
private LinearLayout profileFrame, signinFrame;
private SharedPreferences mPrefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
signinButton = (SignInButton) findViewById(R.id.button1);
signinButton.setOnClickListener(this);
// image = (ImageView) findViewById(R.id.image);
// username = (TextView) findViewById(R.id.username);
// emailLabel = (TextView) findViewById(R.id.email);
profileFrame = (LinearLayout) findViewById(R.id.profileFrame);
// signinFrame = (LinearLayout) findViewById(R.id.signinFrame);
mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(Plus.API, Plus.PlusOptions.builder().build()).addScope(Plus.SCOPE_PLUS_LOGIN).build();
}
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
protected void onStop() {
super.onStop();
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
private void resolveSignInError() {
if (mConnectionResult.hasResolution()) {
try {
mIntentInProgress = true;
mConnectionResult.startResolutionForResult(this, RC_SIGN_IN);
} catch (SendIntentException e) {
mIntentInProgress = false;
mGoogleApiClient.connect();
}
}
}
@Override
public void onConnectionFailed(ConnectionResult result) {
if (!result.hasResolution()) {
GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, 0).show();
return;
}
if (!mIntentInProgress) {
// store mConnectionResult
mConnectionResult = result;
if (signedInUser) {
resolveSignInError();
}
}
}
@Override
protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
switch (requestCode) {
case RC_SIGN_IN:
if (responseCode == RESULT_OK) {
signedInUser = false;
}
mIntentInProgress = false;
if (!mGoogleApiClient.isConnecting()) {
mGoogleApiClient.connect();
}
break;
}
}
@Override
public void onConnected(Bundle arg0) {
signedInUser = false;
Toast.makeText(this, "Connected", Toast.LENGTH_LONG).show();
getProfileInformation();
}
private void updateProfile(boolean isSignedIn) {
// if (isSignedIn) {
// signinFrame.setVisibility(View.GONE);
// profileFrame.setVisibility(View.VISIBLE);
//
// } else {
// signinFrame.setVisibility(View.VISIBLE);
// profileFrame.setVisibility(View.GONE);
// }
if (isSignedIn) {
Intent intent = new Intent(AndroidGooglePlusExample.this, HomePage.class);
startActivity(intent);
}
}
private void getProfileInformation() {
try {
if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {
Person currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient);
String personName = currentPerson.getDisplayName();
String personPhotoUrl = currentPerson.getImage().getUrl();
String email = Plus.AccountApi.getAccountName(mGoogleApiClient);
username.setText(personName);
emailLabel.setText(email);
new LoadProfileImage(image).execute(personPhotoUrl);
// update profile frame with new info about Google Account
// profile
updateProfile(true);
//storing details in shared preference
if(mPrefs == null){
mPrefs = this.getSharedPreferences("MyGamePreferences", android.content.Context.MODE_PRIVATE);
}
SharedPreferences.Editor editor = mPrefs.edit();
//editor.putInt("login",401);
editor.putString("Guser_name", personName);
editor.putString("Guserpic_url", personPhotoUrl);
editor.putString("Guser_email", email);
editor.commit();
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onConnectionSuspended(int cause) {
mGoogleApiClient.connect();
updateProfile(false);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
googlePlusLogin();
break;
}
}
public void signIn(View v) {
googlePlusLogin();
}
// public void logout(View v) {
// googlePlusLogout();
// }
private void googlePlusLogin() {
if (!mGoogleApiClient.isConnecting()) {
signedInUser = true;
resolveSignInError();
}
}
// private void googlePlusLogout() {
// if (mGoogleApiClient.isConnected()) {
// Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
// mGoogleApiClient.disconnect();
// mGoogleApiClient.connect();
// updateProfile(false);
// }
// }
// download Google Account profile image, to complete profile
private class LoadProfileImage extends AsyncTask<String, Void, Bitmap> {
ImageView downloadedImage;
public LoadProfileImage(ImageView image) {
this.downloadedImage = image;
}
protected Bitmap doInBackground(String... urls) {
String url = urls[0];
Bitmap icon = null;
try {
InputStream in = new java.net.URL(url).openStream();
icon = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return icon;
}
protected void onPostExecute(Bitmap result) {
downloadedImage.setImageBitmap(result);
}
}
}
This is my second activity
public class HomePage extends Fragment {
SharedPreferences mPrefs;
Button logout_btn;
// Google client to communicate with Google
private GoogleApiClient mGoogleApiClient;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.activity_home_page, container, false);
// TextView name =(TextView)rootView.findViewById(R.id.username);
// TextView emailid =(TextView)rootView.findViewById(R.id.email);
// ImageView myimage=(ImageView)rootView.findViewById(R.id.image);
logout_btn=(Button)rootView.findViewById(R.id.logout);
logout_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Editor editor = mPrefs.edit();
String name = mPrefs.getString("Guser_name", "");
Log.d("", name);
String pic = mPrefs.getString("Guserpic_url", "");
String email = mPrefs.getString("Guser_email", "");
}
public void logout(View v) {
googlePlusLogout();
}
private void googlePlusLogout() {
if (mGoogleApiClient.isConnected()) {
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
// updateProfile(false);
}
}
});
return rootView;
}
}
this is my login xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="15dp"
tools:context=".AndroidGooglePlusExample" >
<LinearLayout
android:id="@+id/signinFrame"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:gravity="center"
android:orientation="vertical"
android:visibility="visible" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:text="@string/loginText"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#ffffff" />
<com.google.android.gms.common.SignInButton
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:textSize="18dp" />
logout xml
<LinearLayout
android:id="@+id/profileFrame"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:gravity="center"
android:orientation="vertical"
>
<ImageView
android:id="@+id/image"
android:layout_width="80dp"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:textSize="20dp" />
<TextView
android:id="@+id/email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:textSize="16dp" />
<Button
android:id="@+id/logout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="logout"
android:padding="10dp"
android:text="@string/logout"
android:textSize="18dp" />
</LinearLayout>
回答1:
As per the initial chat discussion, you have a working code example for implementation of Android Login with Google Plus Account but you need to modify it with as per your requirement. I can give an idea only but unable to give an example for it !!
So here is my suggestions to meet your task completion.
- As you mentioned in the post your able to login with Google+ account successfully. After successful login you need to store the credentials of the user (user name & password) in Shared Preferences along with a Boolean value (true/false) as a login status (logged-in /logged-out)
- Then when your navigating to the second screen you can place a button in that and set an action to it for logout. after clicking the button you need to check the Boolean value in the shared preferences and if it is login you can logout the Google+ and update your preferences with new values ( username - null, password -null , Boolean status -false)
This links may help you to Role on
Start integrating Google+ into your Android
Google Plus Account in Android Example
来源:https://stackoverflow.com/questions/31956346/google-plus-login-from-one-activity-and-logout-from-second-activity-by-clicking