Я интегрировал регистрацию в Google и Facebook, используя соответствующие методы. Но после успешного подписания я хочу открыть другую активность, и точно так же пользователь может перейти к различным действиям. Я использовал панель действий, где я даю возможность выйти из любой учетной записи, в которую вошел пользователь. Как я могу выйти из пользователя, когда я занимаюсь другой деятельностью, а не основной деятельностью. Я получаю исключение и не могу передать ссылку apiclient (для google) и ссылку на сеанс (для facebook) другому действию. Пожалуйста помоги. Заранее спасибо.
Выйти из google и facebook в приложении для Android
Ответы (12)
Выйти из гугла:
Просто добавьте это в свою новую активность, где вы хотите, чтобы была кнопка выхода из Google+:
@Override
protected void onStart() {
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
mGoogleApiClient.connect();
super.onStart();
}
и затем вы можете установить setOnClickListener на кнопку:
signout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
// ...
Toast.makeText(getApplicationContext(),"Logged Out",Toast.LENGTH_SHORT).show();
Intent i=new Intent(getApplicationContext(),MainActivity.class);
startActivity(i);
}
});
}
});
GoogleApiClient
должен находиться в классе Application
. поэтому его можно использовать во время выхода из системы.
- person Rumit Patel; 19.06.2018
Для Facebook
LoginManager.getInstance().logOut();
Для Google
GoogleSignInOptions gso = new GoogleSignInOptions.
Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).
build();
GoogleSignInClient googleSignInClient=GoogleSignIn.getClient(context,gso);
googleSignInClient.signOut();
Выйти из фейсбука:
public static void callFacebookLogout(Context context) {
Session session = Session.getActiveSession();
if (session != null) {
if (!session.isClosed()) {
session.closeAndClearTokenInformation();
//clear your preferences if saved
}
} else {
session = new Session(context);
Session.setActiveSession(session);
session.closeAndClearTokenInformation();
//clear your preferences if saved
}
}
Выйти из гугла:
@Override
public void onClick(View view) {
if (view.getId() == R.id.sign_out_button) {
if (mGoogleApiClient.isConnected()) {
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
}
}
}
Обновлено от 7 ноября 2017 г. Последний код для события входа и выхода
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
Выход из Google
mGoogleSignInClient.signOut()
.addOnCompleteListener(this, new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
// [START_EXCLUDE]
updateUI(null);
// [END_EXCLUDE]
}
});
Google отозвать доступ
mGoogleSignInClient.revokeAccess()
.addOnCompleteListener(this, new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
// [START_EXCLUDE]
updateUI(null);
// [END_EXCLUDE]
}
});
См. код Google Здесь
Facebook Выход
LoginManager.getInstance().logOut();
См. документ Facebook здесь
просто добавьте в свою новую деятельность это:
@Override
protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
}
а потом
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.sign_out_button2:
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
выйти из фейсбука довольно просто
просто добавьте следующий код
LoginManager.getInstance().logOut();
затем вы можете перенаправить пользователя на вход в систему, добавив следующий код
LoginManager.getInstance().logOut();
Intent intent = new Intent(CurrentActivity.this, LoginActivity.class);
startActivity(intent);
finish();
поэтому ваш окончательный код для logoutFromFacebook будет
public void logoutFromFacebook(){
LoginManager.getInstance().logOut();
Intent intent = new Intent(CurrentActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
Теперь просто вызовите этот метод в событии кнопки выхода из системы.
Во-первых, для выхода из Facebook:
LoginManager.getInstance().logOut();
Если вы пытаетесь выйти из другого действия или фрагмента, это приведет к ошибке, например, Facebook SDK не инициализирован. Затем сначала вам нужно инициализировать facebook sdk, например:
FacebookSdk.sdkInitialize(your context here);
а затем выйти из менеджера.
Вторичный для выхода из Google:
сначала вы должны проверить, подключен ли клиент Google или нет, и если он подключен, то вызовите код выхода:
if (mGoogleApiClient.isConnected())
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
здесь mGoogleApiClient является объектом GoogleApiClient.
Для гугл-аккаунта
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
и для аккаунта в фейсбуке
LoginManager.getInstance().logOut();
Для выхода из Facebook.
public void logoutFromFacebook() {
Session session = Session.getActiveSession();
session.closeAndClearTokenInformation();
// Clear Preferences and other data and go back to login activty
}
Для выхода из Google+. Имейте в виду, что выход из Google+ немного сложнее, чем из Facebook. Вам нужно будет управлять логическим значением, чтобы отслеживать события при выходе из системы (так же, как вы делали это при входе в систему).
public void logoutFromGooglePlus() {
mGooglePlusLogoutClicked = true; // Keep track when you click logout
if (mGoogleApiClient.isConnected()) {
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
revokeAccess();
} else {
mGoogleApiClient.connect(); // It can send user to onConnected(), call logout again from there
}
}
// revoke access (if needed)
protected void revokeAccess() {
Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
// Clear data and go to login activity
}
});
}
Чтобы ответить на вопрос в комментарии: GoogleApiClient
может быть создан много раз в приложении, и он по-прежнему принимает тот же экземпляр, который был инициализирован в первый раз. Так что не беспокойтесь о том, как «пропустить» GoogleApiClient
между действиями. Это облегченный клиент, предназначенный для инициализации в качестве нового экземпляра в каждом действии. Просто создайте новый GoogleAPiClient
, позвоните .connect()
и начинайте работать. Однако вам придется реализовать необходимые для этого интерфейсы, но вы можете оставить методы пустыми, если вы не собираетесь выполнять там какую-либо работу.
Что касается mLogoutClicked
логического значения, вы можете оставить свои собственная реализация по вашему желанию. По сути, это просто способ сообщить методу onConnected()
, что вы пришли для выхода из системы. (посмотрите на код, мы также вызываем .connect()
при выходе из системы. Таким образом, он может войти в onConnected()
и столкнуться с вашим кодом входа). Вы бы сделали что-то подобное на своем onconnected()
public void onConnected(Bundle connectionHint) {
if (mGooglePlusLogoutClicked) {
logoutFromGooglePlus();
mGooglePlusLogoutClicked = false;
}
}
В качестве совета по поводу вашего потока реализации сделайте так, чтобы базовый класс выполнял всю GoogleApiClient
инициализацию и позволял действиям входа и другим действиям расширять его. Таким образом, он будет неявно решать проблему инициализации клиента в каждом действии. Просто внедрите общий код onConnected()
, onConnectionFailed()
и т. д. в базовую активность и позвольте активности входа переопределить их для реализации логики входа. (и то же самое для выхода из системы. Он переопределит их и обработает код выхода)
Просто это также в другом действии, отличном от входа в систему, где у вас должна быть кнопка входа.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(fromActivity.getString(R.string.default_web_client_id))
.requestEmail()
.requestProfile()
.build();
// Build a GoogleSignInClient with the options specified by gso.
GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(fromActivity, gso);
mGoogleSignInClient.signOut();
Самый простой способ выйти из аутентификации Google:
GoogleSignIn.getClient(getApplicationContext(), GoogleSignInOptions.DEFAULT_SIGN_IN).signOut();
Вот вам и Google.
Button login, signup, signout;
GoogleSignInClient mGoogleSignInClient;
private static final int RC_SIGN_IN = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
login = findViewById(R.id.login);
signup = findViewById(R.id.signup);
signout = findViewById(R.id.signout);
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
signout.setOnClickListener(v -> mGoogleSignInClient.signOut()
.addOnCompleteListener(this, task -> Log.e("checker", "Sign Out")));
signup.setOnClickListener(v -> {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
});
login.setOnClickListener(v -> {
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
if (account != null) {
String personName = account.getDisplayName();
String personEmail = account.getEmail();
String personId = account.getId();
Uri personPhoto = account.getPhotoUrl();
Log.e("checker", personName);
Log.e("checker", personId);
Log.e("checker", String.valueOf(personPhoto));
Log.e("checker", personEmail);
} else
Log.e("checker", "did not login");
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
}
}
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
GoogleSignInAccount account = completedTask.getResult(ApiException.class);
if (account != null) {
String personName = account.getDisplayName();
String personEmail = account.getEmail();
String personId = account.getId();
Uri personPhoto = account.getPhotoUrl();
Log.e("checker", personName);
Log.e("checker", personId);
Log.e("checker", String.valueOf(personPhoto));
Log.e("checker", personEmail);
}
else
Log.e("checker", "Failed!");
} catch (ApiException e) {
Log.e("checker", "signInResult:failed code=" + e.getStatusCode());
}
}
Это для Фейсбука.
LoginManager.getInstance().logOut();