Как мое приложение может узнать, когда пользователь выходит из своего приложения Facebook для Android?
Как мое приложение может узнать, когда пользователь выходит из родного приложения Facebook?
Я использую приведенный ниже код для выхода из Facebook в моем приложении. И это работает нормально.
class LogoutTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
if (facebook.isSessionValid()) {
try {
facebook.logout(getApplicationContext());
editLoginStatus(false);
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("access_token", null);
editor.putLong("access_expires",
facebook.getAccessExpires());
editor.commit();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
Но проблема возникает, когда пользователь выходит из родного приложения Facebook и затем нажимает кнопку выхода из системы в моем приложении.
Это показывает мне следующую ошибку
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.IllegalArgumentException: Invalid context argument
at android.webkit.CookieSyncManager.createInstance(CookieSyncManager.java:86)
at com.facebook.internal.Utility.clearCookiesForDomain(Utility.java:319)
at com.facebook.internal.Utility.clearFacebookCookies(Utility.java:343)
at com.facebook.Session.closeAndClearTokenInformation(Session.java:798)
at com.facebook.android.Facebook.logoutImpl(Facebook.java:665)
at com.facebook.android.Facebook.logout(Facebook.java:642)
at com.example.animation.StartLoginActivity$LogoutTask.doInBackground(StartLoginActivity.java:328)
at com.example.animation.StartLoginActivity$LogoutTask.doInBackground(StartLoginActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
и я вызываю эту функцию, как показано ниже
if (facebook.getAccessToken() != null && facebook.isSessionValid() == true) {
new LogoutTask().execute();
}
здесь accessToken Я храню локально в sharedPreference, так что он не будет нулевым, пока я не выйду из своего приложения, но я думаю, что после выхода из нативного приложения FB facebook.isSessionValid()
должен возвращать false, пока он возвращает true . Так как проверить, что приложение Facebook уже вышло из системы или нет?
3 ответа
При уничтожении вы очищаете информацию о сеансе и токене, чтобы при выходе из нативного приложения он очистил свои учетные данные
использовать этот
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Session session = Session.getActiveSession();
session.closeAndClearTokenInformation();
}
ИЛИ ЖЕ
public void logoutFromFacebook() {
mAsyncRunner.logout(this, new RequestListener() {
@Override
public void onComplete(String response, Object state) {
Log.d("Logout from Facebook", response);
if (Boolean.parseBoolean(response) == true) {
// User successfully Logged out
}
}
@Override
public void onIOException(IOException e, Object state) {
}
@Override
public void onFileNotFoundException(FileNotFoundException e,
Object state) {
}
@Override
public void onMalformedURLException(MalformedURLException e,
Object state) {
}
@Override
public void onFacebookError(FacebookError e, Object state) {
}
});
}
попробуйте это работает для меня.. так что это также решит вашу проблему также
Попробуйте проверить, есть ли учетная запись Facebook в системе.
AccountManager accountManager = AccountManager.get(context);
Account[] facebookAccounts = accountManager.getAccountsByType("com.facebook.auth.login");
if (facebookAccounts.length > 0) {
facebook.logout(getApplicationContext());
...
}
Да, код содержит жестко закодированный тип учетной записи, который ненадежен из-за возможных изменений в собственном приложении, хотя вероятность таких изменений очень мала.
И не забудьте добавить разрешение GET_ACCOUNTS в манифест.
Хмммм... Это может быть сложно. Я предполагаю, что isSessionValid является автономной проверкой от FB API.
Исходя из вашей ситуации, похоже, вам все еще нужно сделать один вызов в FB, чтобы проверить, действительно ли сеанс действителен или нет. Поэтому, исходя из вашей ситуации, я предлагаю сделать простой вызов FB API, такой как /me
просто чтобы проверить правильность сеанса.
Если сеанс действителен, то вы вручную вызываете API выхода из системы, в противном случае вы знаете, что сеанс FB истек / вышел из системы.
Надеюсь помогает:)