Facebook SDK для Android — установка идентификатора приложения программно

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

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

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

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


person Matt Accola    schedule 25.02.2013    source источник
comment
Вы можете следовать идее Рави Кумара. Но это не будет работать ни для каких FacebookDialogs. Для диалогов вы можете написать собственный конструктор DialogBuilders в SDK.   -  person Sripathi    schedule 09.07.2014


Ответы (5)


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

Вы можете просто сделать это, используя этот однострочный код:

FacebookSdk.setApplicationId(APP_ID);

Спасибо!

person Hardy    schedule 14.04.2015
comment
Можем ли мы сделать это в любое время или это должно быть до FacebookSdk.sdkInitialize()? - person Sagar; 10.10.2015

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

    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
        }
    }
}
person Ravi Kumar    schedule 10.06.2013
comment
Я не могу заставить это работать. if session.getState().equals(SessionState.CREATED_TOKEN_LOADED) пропускается - person user1634451; 22.10.2013
comment
Как это используется в сочетании с UIHelper? - person Alfie Hanssen; 30.10.2013

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

person Matt Accola    schedule 26.02.2013

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

Session session = new Session.Builder(context).setApplicationId(applicationId).build();
person mhradek    schedule 08.04.2013
comment
Как вы используете это в сочетании с UIHelper? - person Alfie Hanssen; 30.10.2013
comment
Я проверяю, есть ли у меня действительный сеанс, прежде чем вызывать UiLifecycleHelper через обратный вызов. Я предполагаю, что это не так элегантно, как нестандартная разветвленная версия, но это снижает наше обслуживание. - person mhradek; 03.12.2013

Я думаю, что есть более простой способ сделать это, просто вызвать статический метод setApplicationId com.facebook.Settings.setApplicationId(facebookID);

И вы можете идти. Нет необходимости создавать сеанс вручную с помощью Builder и устанавливать его в качестве активного сеанса!

Подробности дефекта:

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

Ваше здоровье.

person MAB    schedule 12.11.2014
comment
Хорошая находка, но getMetadataApplicationId вызывается только в том случае, если идентификатор приложения = null, что означает, что вы не можете обновить идентификатор приложения, если он у вас уже есть. - person Wayne; 29.09.2015