2013-02-25 2 views
8

У меня есть приложение для Android, которому необходимо подключиться к другому приложению Facebook (другое приложение) на основе настроек приложения, которые можно изменить во время выполнения.Facebook SDK для Android - установить идентификатор приложения программно

Представьте, что приложение может быть настроено на DEV, TEST или PROD. При указании на DEV идентификатор приложения FB должен быть «1». При указании на TEST идентификатор приложения FB должен быть «2». и т. д.

Проблема заключается в том, что UiLifecycleHelper из Facebook SDK автоматически считывает «com.facebook.sdk.ApplicationId» из AndroidManifest.xml во время фазы onCreate. По-видимому, не существует способа установить это программно.

Возможно ли использовать UiLifecycleHelper и указать другой идентификатор приложения во время выполнения или мне нужно вернуться к ручному управлению сеансом?

+0

Вы можете следовать идее Рави Кумара. Но он не будет работать для каких-либо FacebookDialogs. Для диалогов вы можете написать свой собственный конструктор для DialogBuilders в SDK. – Sripathi

ответ

3

Я решил развить проект facebook-android-sdk на GitHub и внести необходимые изменения. Я отправил запрос на перенос с моими изменениями, если кому-то интересно, https://github.com/facebook/facebook-android-sdk/pull/294.

0

Вы не можете просто разветвить SDK и добавить эти изменения самостоятельно?

+0

да, это то, что я буду делать, если придется, но это неудачно, если в API нет поддерживаемого способа сделать это. –

3

Да, вы можете установить его программно. Используйте класс Session $ Builder, который позволяет вам создавать сеанс без использования одного из частных конструкторов.

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

Как вы используете это совместно с UIHelper? –

+0

Я проверяю, есть ли у меня действительный сеанс перед вызовом UiLifecycleHelper через обратный вызов. Я полагаю, что это не так элегантно, как обычная версия, но она поддерживает наше обслуживание. – mhradek

13

Вот то, что я использовал, чтобы установить идентификатор приложения 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

+0

Я не могу заставить это работать. if session.getState(). equals (SessionState.CREATED_TOKEN_LOADED) пропускается через – user1634451

+1

Как это используется в сочетании с UIHelper? –

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(); 
    } 

Который в свою очередь, будет использоваться всеми вызовами, чтобы создать a Сессия:

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

Cheers.

+0

Хорошая находка, но 'getMetadataApplicationId' вызывается, только если app id = null, что означает, что вы не можете обновить свой идентификатор приложения, если у вас его уже есть. – Wayne

23

Привет всем я знаю выше ответа является правильным для older sdk version, но в facebook sdk 4 нет Session класса

Вы можете просто сделать это с помощью этого единого кода строки:

FacebookSdk.setApplicationId(APP_ID); 

Спасибо!

+2

Можем ли мы сделать это в любое время, или это должно быть до FacebookSdk.sdkInitialize()? – Sagar

Смежные вопросы