我有一个Activity应该处理来自Facebook SDK和其他自定义活动的结果。
我在哪里可以找到Facebook SDK使用的requestCodes,以便不在我的活动中使用它?
我应该能够使用他们的requestCode在onActivityResult
中区分它们,因此它们必须是唯一的。
答案 0 :(得分:29)
在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
}
}
来自the docs
isFacebookRequestCode(int)的
如果请求代码在Facebook SDK请求使用的范围内,则返回true。这不包括您在对话框,按钮或LoginManager上明确设置的请求代码。 SDK使用的请求代码范围从callbackRequestCodeOffset开始,并继续接下来的100个值。
sdkInitialize(Context,int)
此功能初始化Facebook SDK,如果未调用此功能,则不确定Facebook SDK功能的行为。它应该尽早调用。
<强>
public static synchronized void sdkInitialize(Context applicationContext, int callbackRequestCodeOffset)
强>
applicationContext
应用程序上下文
callbackRequestCodeOffset
将调用Facebook活动的请求代码偏移量。请不要在您的其他请求中使用您设置的值与其后的其他100个条目之间的范围。
答案 1 :(得分:25)
转到CallbackManagerImpl.RequestCodeOffset。我个人使用这样的代码来防止不必要的行为。
if (requestCode == CallbackManagerImpl.RequestCodeOffset.Login.toRequestCode()) {
callbackManager.onActivityResult(requestCode, resultCode, data);
}
答案 2 :(得分: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;
}
}
答案 3 :(得分:3)
您可以设置自己的请求代码以消除歧义。所有OpenRequest和NewPermissionsRequest类都采用requestCode参数:
答案 4 :(得分:2)
如果您通过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);
}
}
答案 5 :(得分: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),
;
这些可以通过foll访问。代码:
if (requestCode == CallbackManagerImpl.RequestCodeOffset.Share.toRequestCode()) {
callbackManager.onActivityResult(requestCode, resultCode, data);
}
答案 6 :(得分: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)LoginManager.java
public void registerCallback(
...
((CallbackManagerImpl) callbackManager).registerCallback([your request code here],
new CallbackManagerImpl.Callback() {
@Override
...
}
);
}