我有一个 Activity 应该处理来自 Facebook SDK 和其他自定义活动的结果。
我在哪里可以找到 Facebook SDK 使用的 requestCodes,以免在我的活动中使用相同的?
我应该能够在onActivityResult
使用他们的 requestCode 时将它们区分开来,因此它们需要是唯一的。
我有一个 Activity 应该处理来自 Facebook SDK 和其他自定义活动的结果。
我在哪里可以找到 Facebook SDK 使用的 requestCodes,以免在我的活动中使用相同的?
我应该能够在onActivityResult
使用他们的 requestCode 时将它们区分开来,因此它们需要是唯一的。
在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
应用程序上下文
callbackRequestCodeOffset
Facebook 活动将被调用的请求代码偏移量。请不要在您的其他请求中使用您设置的值与之后的另外 100 个条目之间的范围。
转到 CallbackManagerImpl.RequestCodeOffset。我个人使用这样的一段代码来防止不必要的行为。
if (requestCode == CallbackManagerImpl.RequestCodeOffset.Login.toRequestCode()) {
callbackManager.onActivityResult(requestCode, resultCode, data);
}
尝试这个:
@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;
}
}
您可以设置自己的请求代码来消除歧义。所有 OpenRequest 和 NewPermissionsRequest 类都采用 requestCode 参数:
如果您通过 LoginButton 使用 FB 登录,则提供替代方案
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);
}
}
除了 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);
}
在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
...
}
);
}