我有一个原生Android应用,需要根据可在运行时更改的应用设置连接到不同的Facebook应用(不同的应用ID)。
想象一下,应用程序可以设置为指向DEV,TEST或PROD。当指向DEV时,FB应用程序ID应为“1”。当指向TEST时,FB应用程序ID应为“2”。等
问题是来自Facebook SDK的UiLifecycleHelper在onCreate阶段自动从AndroidManifest.xml读取“com.facebook.sdk.ApplicationId”。似乎没有办法以编程方式设置它。
是否可以使用UiLifecycleHelper并在运行时指向不同的应用程序ID,还是必须回退到手动管理会话?
答案 0 :(得分:25)
大家好我知道以上答案适合older sdk version
,但在facebook sdk 4
中没有Session
类
您只需使用以下单行代码即可:
FacebookSdk.setApplicationId(APP_ID);
谢谢!
答案 1 :(得分:13)
这里我用来以编程方式设置应用程序ID
private Session.StatusCallback statusCallback = new SessionStatusCallback();
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String s=""+R.string.app_id;
Session session = new Session.Builder(getBaseContext()).setApplicationId(s).build();
Session.setActiveSession(session);
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
}
}
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
// TODO Auto-generated method stub
if(session.isOpened()){
//Do your task
}
}
}
答案 2 :(得分:3)
我决定在GitHub上分叉facebook-android-sdk项目并进行必要的更改。如果有人有兴趣,我已经提交了我的更改请求,https://github.com/facebook/facebook-android-sdk/pull/294。
答案 3 :(得分:3)
是的,您可以通过编程方式进行设置。使用Sessions $ Builder类,它允许您构建会话而无需使用其中一个私有构造函数。
Session session = new Session.Builder(context).setApplicationId(applicationId).build();
答案 4 :(得分:2)
我认为有一种更简单的方法,只需调用静态方法setApplicationId com.facebook.Settings.setApplicationId(facebookID);
你很高兴去。无需使用Builder手动创建会话并将其设置为活动会话!
缺陷详情:
您在设置类中设置的facebookID将由getMetadataApplicationId
com.facebook.internal.Utility
方法使用
public static String getMetadataApplicationId(Context context) {
Validate.notNull(context, "context");
Settings.loadDefaultsFromMetadata(context);
return Settings.getApplicationId();
}
所有调用都将使用它来创建会话:
Session(Context context, String applicationId, TokenCachingStrategy tokenCachingStrategy,
boolean loadTokenFromCache) {
// if the application ID passed in is null, try to get it from the
// meta-data in the manifest.
if ((context != null) && (applicationId == null)) {
applicationId = Utility.getMetadataApplicationId(context);
}
Validate.notNull(applicationId, "applicationId");
.
.
.
}
干杯。
答案 5 :(得分:0)
你不能简单地分叉SDK并自己添加这些更改吗?