安卓Facebook SDK - 如何通过编程设置应用ID

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,或者必须回退到手动管理会话?

你可以借鉴Ravi Kumar的思路,但这并不适用于所有的FacebookDialogs。对于对话框,你可以在SDK中编写自己的DialogBuilders构造函数。 - Sripathi
5个回答

26

大家好,我知道上面的答案对于较旧的SDK版本是正确的,但在Facebook SDK 4中没有Session类。

您可以使用这一行代码简单地完成:

FacebookSdk.setApplicationId(APP_ID);

谢谢!


3
我们可以随时进行还是必须在FacebookSdk.sdkInitialize()之前进行? - Sagar

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
        }
    }
}

我无法让它工作。if session.getState().equals(SessionState.CREATED_TOKEN_LOADED) 被跳过了。 - user1634451
1
这个如何与UIHelper一起使用? - Alfie Hanssen

3

是的,你可以通过编程设置它。使用Sessions$Builder类,它允许你构建一个会话而不需要使用其中的一个私有构造函数。

Session session = new Session.Builder(context).setApplicationId(applicationId).build();

你如何将它与UIHelper一起使用? - Alfie Hanssen
在通过回调调用UiLifecycleHelper之前,我会检查是否有有效的会话。我想这不如使用自定义分支版本那样优雅,但它可以降低我们的维护成本。 - mhradek

3

2
我认为有一种更简单的方法来完成这个操作,只需调用静态方法setApplicationId com.facebook.Settings.setApplicationId(facebookID); 即可。
然后就可以了。不需要手动创建Builder会话并将其设置为活动会话!

缺陷细节:
在设置类中设置的facebookID将被 com.facebook.internal.UtilitygetMetadataApplicationId 方法使用。
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");
.
.
.
}

干杯。

不错的发现,但是只有在应用程序ID为null时才会调用getMetadataApplicationId,这意味着如果您已经拥有一个应用程序ID,则无法更新它。 - Wayne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接