如何我的应用程序可以从它的Andr​​oid原生的Facebook应用程序知道当用户注销?

问题描述:

如何我的应用程序可以从它的原生的Facebook应用程序知道当用户注销?

How my app can know when user logout from its native Facebook app ?

我使用跌破$ C $下从Facebook注销我的应用程序。它是工作的罚款。

I am using below code for Logging out from Facebook in my app. And it is working fine.

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应用程序退出,然后单击注销按钮上我的应用程序产生的。

But problem is occurring when user logging out from its native Facebook app and then clicking on the logout button on my app.

这显示了我下面的错误

 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我存储在本地共享preference,所以它不会为空,只要我不从我的应用程序退出,但我从本地FB应用 facebook.isSessionValid()应该返回假,而它返回真。所以如何检查就知道Facebook的应用程序已经被注销或不?

here accessToken I am storing locally in sharedPreference , so it won't be null as long as I am not logging out from my app , but I guess after logging out from native FB app facebook.isSessionValid() should return false while it is returning true .So how to check to know Facebook app is already logging out or not ?

尝试检查是否有在系统中的Facebook帐户。

Try to check if there's a Facebook account in the system.

AccountManager accountManager = AccountManager.get(context);
Account[] facebookAccounts = accountManager.getAccountsByType("com.facebook.auth.login");
if (facebookAccounts.length > 0) {
    facebook.logout(getApplicationContext());
    ...
}

是的,code包含硬codeD帐户类型,这是稍微不可靠的,由于在本机应用程序可能发生的变化,但这种变化的可能性是非常小的。

Yes, the code contains hard-coded account type, which is slightly unreliable due to possible changes in the native app, though the probability of such changes is very small.

和不要忘记添加 GET_ACCOUNTS 许可以清单。

And don't forget to add a GET_ACCOUNTS permission to the Manifest.