2013-02-25 51 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

相關問題