如何在Android Facebook SDK中使用AccessTokenTracker

5

我正在使用Facebook SDK 4.0

当我进入应用程序设置并删除先前给予的权限时,AccessTokenTracker未被调用。怎么样才能使AccessTokenTracker被调用?

我正在测试登录的用例,但是以下情况无法被AccessTokenTracker跟踪:

某人通过应用程序设置从Facebook中删除您的应用程序,并重新访问您的应用程序。您的应用程序应检测到此并提示用户重新登录。

1)进入您的应用程序,点击“使用Facebook登录”按钮
2)点击“允许读取权限”(如果适用,则再次点击“允许写入权限”)
3)在Facebook上进入应用程序设置并删除您的应用程序
4)重复步骤1-2并验证Facebook登录是否正常工作

这是我的MainActivity代码,它只是一个简单的应用程序,旨在学习如何使用SDK。

package com.ognid.acesstokentracker;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;

import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
import com.facebook.CallbackManager;
import com.facebook.FacebookSdk;


public class MainActivity extends ActionBarActivity {
    CallbackManager callbackManager;
    AccessTokenTracker accessTokenTracker;
    Fragment selection=new SelectionFragment();
    Fragment login=new LoginFragment();
    String TAG=MainActivity.class.getSimpleName();


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FacebookSdk.sdkInitialize(this.getApplicationContext());
        callbackManager = CallbackManager.Factory.create();

        accessTokenTracker = new AccessTokenTracker() {
            @Override
            protected void onCurrentAccessTokenChanged(
                    AccessToken oldAccessToken,
                    AccessToken currentAccessToken) {
                Log.d(TAG,"onCurrentAccessTokenChanged");
                updateWithToken(currentAccessToken);

            }
        };
        setContentView(R.layout.activity_main);
    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"is tracking:"+accessTokenTracker.isTracking());

    }

    private void updateWithToken(AccessToken token) {
        if(token!=null)showFragment(selection);
        else showFragment(login);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        accessTokenTracker.stopTracking();
    }

    @Override
    protected void onResumeFragments() {
        super.onResumeFragments();
        updateWithToken(AccessToken.getCurrentAccessToken());
    }

    void showFragment(Fragment f){
        getSupportFragmentManager().beginTransaction().replace(R.id.container,f).commit();
    }



}

Diego,你解决了这个问题吗?我也遇到了同样的问题。 - flyingAssistant
2个回答

3
一般来说,如果您从Facebook中撤销了某个权限,则该权限在本地应用程序中不会更改。在这种情况下,如果您的应用程序没有足够的特权执行某个请求,Facebook API将通过权限错误(200)通知您。 假设您想要发布内容,而本地令牌具有发布权限,那么如果您尝试发布,API将返回错误代码200。此时,您需要重新请求发布权限,如果用户授予您的应用程序此权限,则AccessTokenTracker将被调用。
请注意,根据Facebook Android SDK,“本地”访问令牌可能已过时。请查看AccessToken类的getPermission()方法的javadoc。

我们不能在发出图形请求之前使用AccessToken.getPermissions()并检查我们是否具有适当的权限吗?或者AccessToken.getPermissions()只是检查在移动设备上本地缓存的内容(可能与用户帐户上授予的权限不相等)? - Ashraf Alshahawy
1
根据 Facebook 文档,"local" 访问令牌可能已过期。这意味着您不知道本地令牌是否与服务器的令牌对齐。您可以尝试以下操作:为您的 Facebook 应用程序获取发布权限,然后从您的 Facebook 帐户中的应用程序管理菜单中删除它。现在检查您的本地/缓存令牌的权限。 - Francesco Mameli

1
你忘记调用了。
accessTokenTracker.startTracking()

在他们的AccessTokenTracker文档中没有提到,但你需要调用它才能使其工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接