Новый API Facebook 3.0. и совместимость ActionBarSherlock

Я читаю документы facebook Android API 3.0, и я не понимаю, что делает сеанс с фоновой деятельностью. Во всех примерах я должен расширить "FacebookFragment". Хорошо, это было бы неплохо, если бы все мое приложение не расширило "Шерлок-Фрагмент", поэтому я не вижу расширения FacebookFragment в качестве опции.

Если я использую код из SessionLoginExample и помещаю свой AppID в Strings в ту же строку, что и в facebook, я получаю:

Ошибка

10-22 17:04:26.464: E/AndroidRuntime(5491): FATAL EXCEPTION: main
10-22 17:04:26.464: E/AndroidRuntime(5491): java.lang.RuntimeException: Unable to start activity ComponentInfo{nl.specsavers.moodspecs/nl.specsavers.moodspecs.LauncherActivity}: java.lang.NullPointerException: Argument applicationId cannot be null

Я пытаюсь настроить начальную проверку, если приложение установлено или нет, и если сеанс существует или нет.

 Settings.addLoggingBehavior(LoggingBehaviors.INCLUDE_ACCESS_TOKENS);

    Session session = Session.getActiveSession();
    if (session == null) {
        if (savedInstanceState != null) {
            session = Session.restoreSession(this, null, statusCallback, savedInstanceState);
        }
        if (session == null) {
            session = new Session(this);
        }
        Session.setActiveSession(session);
        if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
            session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
        }

    } 

Мне нужно иметь возможность каким-то образом разместить мой идентификатор приложения, что на самом деле все в порядке, но я не могу найти, куда его поместить.

Мне нужно знать, если я могу избежать расширения FacebookFragment, поскольку я использую SherlockFragment.

Tnx.

Ответы

Ответ 1

FacebookFragment не является общедоступным и не предназначен для использования приложениями.

Образцы в основном используют FacebookActivity, и, да, вы не должны расширять FacebookActivity. Как вы упомянули, SessionLoginSample демонстрирует это, и если вы не используете FacebookActivity, вы должны обрабатывать сериализацию сеанса и переопределять/пересылать onActivityResult, как показано на рисунке.

Тем не менее, похоже, что основная проблема, с которой вы сталкиваетесь, связана с настройкой приложения. Вы можете установить applicationId в коде или в метаданных.

В коде:

Чтобы установить его в коде, определите константу строки MY_APP_ID, содержащую ваш идентификатор приложения, и замените строку:

session = new Session(this);

с:

session = new Session.Builder(this).setApplicationId(MY_APP_ID).build();

В метаданных:

Чтобы установить его в метаданных, добавьте следующее в свой AndroidManifest.xml внутри тега приложения, но вне любых тегов активности:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>

Затем в значениях /strings.xml добавьте значение для app_id, у которого есть ваш идентификатор приложения:

<string name="app_id">1234567890</string>

Ответ 2

Вам не нужно наследовать ничего, если вы не предоставляете код app_id через код, вы должны указать его в метаданных вашего приложения (и в вашем файле strings.xml). См. https://developers.facebook.com/docs/reference/android/3.0/Session#APPLICATION_ID_PROPERTY

В вашем AndroidManifest.xml вам нужно добавить:

<application android:label="@string/app_name" ...>
  ... other activity stuff here ...
  <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
</application>

Затем добавьте app_id как строку в файле string.xml.