12

我有一个本机 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,或者我是否必须退回到手动管理会话?

4

5 回答 5

26

你好,我知道上面的答案是正确的older sdk version,但是facebook sdk 4没有Session课程

您可以使用以下单行代码简单地做到这一点:

FacebookSdk.setApplicationId(APP_ID);

谢谢!

于 2015-04-14T08:32:56.597 回答
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
        }
    }
}
于 2013-06-10T02:16:16.713 回答
3

是的,您可以通过编程方式进行设置。使用 Sessions$Builder 类,它允许您构建会话而无需使用私有构造函数之一。

Session session = new Session.Builder(context).setApplicationId(applicationId).build();
于 2013-04-08T22:58:28.760 回答
3

我决定在 GitHub 上 fork facebook-android-sdk 项目并进行必要的更改。如果有人感兴趣,我已经提交了包含我的更改的拉取请求,https://github.com/facebook/facebook-android-sdk/pull/294

于 2013-02-26T06:39:26.503 回答
2

我认为有一种更简单的方法可以做到这一点,只需调用静态方法 setApplicationIdcom.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");
.
.
.
}

干杯。

于 2014-11-12T16:14:20.477 回答