我的应用程序如何知道用户何时从其Android原生Facebook应用程序注销



我的应用程序如何知道用户何时从其本地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,而它返回真。那么如何检查知道Facebook应用程序已经注销或不?

on destroy清除会话和令牌信息,以便当您从本机应用程序注销时…它将清除其凭据

使用

  @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());
    ...
}

是的,代码包含硬编码的帐户类型,由于原生应用中可能发生的更改,因此稍微不可靠,尽管此类更改的概率非常小。

不要忘记给Manifest添加一个GET_ACCOUNTS权限。

嗯…这可能会很棘手。我猜isSessionValid是从FB API离线检查。

从您的情况来看,看起来您仍然需要对FB进行一次调用来检查会话是否真的有效。因此,根据您的情况,我的建议是进行简单的FB API调用,例如/me,只是为了检查会话的有效性。

如果会话有效,则手动调用注销API,否则,您知道FB会话过期/注销。

希望帮助:)

相关内容

  • 没有找到相关文章

最新更新