22

我有一个 Activity 应该处理来自 Facebook SDK 和其他自定义活动的结果。

我在哪里可以找到 Facebook SDK 使用的 requestCodes,以免在我的活动中使用相同的?

我应该能够在onActivityResult使用他们的 requestCode 时将它们区分开来,因此它们需要是唯一的。

4

7 回答 7

33

sdkInitialize调用中传递请求代码

FacebookSdk.sdkInitialize(context, 1200);

然后

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (FacebookSdk.isFacebookRequestCode(requestCode)) {
      //Facebook activity result
      //Do your stuff here
      //Further you can also check if it's login or Share etc by using 
      //CallbackManagerImpl as explained by rajath's answer here
      if (requestCode == CallbackManagerImpl.RequestCodeOffset.Login.toRequestCode()) {
          //login
      }
      else if (requestCode == CallbackManagerImpl.RequestCodeOffset.Share.toRequestCode()){
         //share
      }
}

文档

isFacebookRequestCode(int)

如果请求代码在 Facebook SDK 请求使用的范围内,则返回 true。这不包括您在对话框、按钮或 LoginManager 上明确设置的请求代码。SDK 使用的请求代码范围从 callbackRequestCodeOffset 开始,并持续到接下来的 100 个值。

sdkInitialize(上下文,int)

该函数初始化 Facebook SDK,如果不调用该函数,Facebook SDK 函数的行为是不确定的。应该尽早调用它。

public static synchronized void sdkInitialize(Context applicationContext, int callbackRequestCodeOffset)
applicationContext 应用程序上下文
callbackRequestCodeOffsetFacebook 活动将被调用的请求代码偏移量。请不要在您的其他请求中使用您设置的值与之后的另外 100 个条目之间的范围。

于 2015-10-28T13:17:38.367 回答
27

转到 CallbackManagerImpl.RequestCodeOffset。我个人使用这样的一段代码来防止不必要的行为。

if (requestCode == CallbackManagerImpl.RequestCodeOffset.Login.toRequestCode()) {
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
于 2015-06-09T12:59:26.220 回答
13

尝试这个:

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

    //Log.iClassMethod();

    switch(requestCode)
    {
        case 1:
            if (resultCode == Activity.RESULT_OK)
            {
                // do something ...
            }
            break;

        case ...:
            if (resultCode == Activity.RESULT_OK)
            {
                // do something ...
            }
            break;

        case Session.DEFAULT_AUTHORIZE_ACTIVITY_CODE:
        {
            Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
            Log.i("Facebook");
        }
        break;
    }
}
于 2013-09-30T09:57:11.107 回答
3

您可以设置自己的请求代码来消除歧义。所有 OpenRequest 和 NewPermissionsRequest 类都采用 requestCode 参数:

设置请求代码

于 2013-07-22T22:47:21.647 回答
3

如果您通过 LoginButton 使用 FB 登录,则提供替代方案

  1. 设置登录按钮的请求码
  2. 使用请求代码区分活动

private LoginButton mFacebookLoginButton;
private static int RC_FB_SIGN_IN;

@Override
protected void onCreate(Bundle savedInstanceState) {
   ...
   mFacebookLoginButton = (LoginButton) findByViewId(R.id.fb_login_button);
   mFacebookLoginButton.registerCallback(...)
   RC_FB_SIGN_IN = mFacebookLoginButton.getRequestCode();
   ...
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RC_GP_SIGN_IN) {
        ...
    } else if (requestCode == RC_FB_SIGN_IN) {
        Log.i(TAG, "Doing my facebook usual things");
        mFacebookCallbackManager.onActivityResult(requestCode, resultCode, data);
    }
}
于 2015-07-06T04:11:38.877 回答
1

除了 Apetroaei Andrei 的回答之外,Facebook SDK 的CallbackManagerImpl类还有其他可用选项:

public enum RequestCodeOffset {
    Login(0),
    Share(1),
    Message(2),
    Like(3),
    GameRequest(4),
    AppGroupCreate(5),
    AppGroupJoin(6),
    AppInvite(7),
    ;

这些可以通过以下方式访问。代码:

if (requestCode == CallbackManagerImpl.RequestCodeOffset.Share.toRequestCode()) {
    callbackManager.onActivityResult(requestCode, resultCode, data);
}
于 2015-09-29T01:59:16.737 回答
0

在lates sdk,(4.4.1)中,可以通过修改facebook库中的两个文件来手动设置请求代码:1)LoginClient.java

 public static int getLoginRequestCode() {
    //return CallbackManagerImpl.RequestCodeOffset.Login.toRequestCode();
    return [your request code here];
}

2)登录管理器.java

 public void registerCallback(
     ...
    ((CallbackManagerImpl) callbackManager).registerCallback([your request code here],
            new CallbackManagerImpl.Callback() {
                @Override
            ...
            }
    );
}
于 2015-07-22T00:34:08.233 回答