2013-02-25 76 views
8

我有一个原生Android应用程序,需要根据可在运行时更改的应用程序设置连接到不同的Facebook应用程序(不同的应用程序ID)。适用于Android的Facebook SDK - 以编程方式设置应用程序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

你可以按照Ravi Kumar的想法。但它不适用于任何FacebookDialogs。对于对话框,您可以在SDK中为DialogBu​​ilder编写自己的构造函数。 – Sripathi 2014-07-09 12:28:44

回答

0

你不能简单地分叉SDK并自己添加这些更改吗?

+0

是的,如果我必须这样做,我会这样做,但如果在API中没有支持的方式来执行此操作,那很不幸。 – 2013-02-25 21:27:32

3

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

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

你如何将这与UIHelper结合使用? – 2013-10-30 16:02:07

+0

我在通过回调调用UiLifecycleHelper之前检查是否有有效的会话。我认为它不像定制的分支版本那么优雅,但它保持了我们的维护。 – mhradek 2013-12-02 23:41:11

13

这里是我用于设置应用程序ID programatcally

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

+1用于查找现有代码的解决方案。 – greg7gkb 2013-07-03 00:21:30

+0

我无法得到这个工作。如果session.getState()。equals(SessionState.CREATED_TOKEN_LOADED)被跳过 – user1634451 2013-10-22 19:53:45

+1

这是如何与UIHelper一起使用的? – 2013-10-30 16:04:26

2

我觉得还有一个更简单的方法来做到这一点,只需调用静态方法setApplicationId com.facebook.Settings.setApplicationId(facebookID);

而你很好去。无需使用Builder手动创建会话并将其设置为活动会话!这个安全漏洞

详情:

的facebookID您在设置班级设置将通过com.facebook.internal.Utility

public static String getMetadataApplicationId(Context context) { 
     Validate.notNull(context, "context"); 

     Settings.loadDefaultsFromMetadata(context); 

     return Settings.getApplicationId(); 
    } 

getMetadataApplicationId方法,这反过来将所有的来电可以用来创建使用会议:

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"); 
. 
. 
. 
} 

干杯。

+0

好找,但只有当应用程序id = null时,才会调用'getMetadataApplicationId',这意味着如果您已经有应用程序ID,则无法更新您的应用程序ID。 – Wayne 2015-09-29 06:10:53

23

您好所有我知道上面的回答是正确的older sdk version,但在facebook sdk 4没有Session

你可以简单地通过使用这一行代码做到这一点:

FacebookSdk.setApplicationId(APP_ID); 

谢谢!

+2

我们可以随时做它,还是必须在FacebookSdk.sdkInitialize()之前? – Sagar 2015-10-10 00:49:38

相关问题