Пример использования Fabric (Twitter Kit) в Android Studio



В конце октября прошлого года ребята из твиттера запустили Fabric. До сих пор информации о Fabric на русском языке в сети не было, поэтому я решил на примере объяснить, как все работает на примере авторизации, ленты твитов, добавлении твита и выходе из аккаунта.

Для начала вам нужно получить сам Fabric. Для этого вам необходимо оставить здесь адрес почты. Письмо не заставит себя долго ждать, я получил платформу через часа два. После подтверждения вы попадаете на страницу с установкой плагина на вашу IDE.

Выбираем Android Studio, скачиваем плагин.

Установить его тоже очень просто: Preferences -> Plugins -> Install plugin from disk Ставим плагин, перезапускаем IDE и вуаля, у нас на панели инструментов появляется синий значок платформы, при клике на который появляется окно авторизации и выбора проекта, но мы создадим новый.

1. Авторизация

Итак, создаем проект. Снова вызываем окно фабрика, выбираем проект для него. Дальше нужно будет установить Twitter Kit (остальные нам пока неинтересны). Для авторизации в твиттере нам понадобиться выбрать в следующем окне третий вариант с авторизаций(Log in with Twitter). Зависимости, мета даты, твиттер кеи он подтянет сам. В следующих окнах он будет уже просить нас добавить несколько строк кода, ну мы же ему не сможем отказать?

В итоге, наш стартовый xml будет иметь тольку кнопку логина:
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:id="@+id/layout">

    <com.twitter.sdk.android.core.identity.TwitterLoginButton
        android:id="@+id/twitter_login_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>
</LinearLayout>



В нашем активити тоже все просто:
MainActivity
public class MainActivity extends ActionBarActivity {

    private static final String TWITTER_KEY = "YOUR_TWITTER_KEY";
    private static final String TWITTER_SECRET = "YOUR_TWITTER_SECRET";
    private TwitterLoginButton loginButton;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
        Fabric.with(this, new Twitter(authConfig));
        setContentView(R.layout.activity_main);

        loginButton = (TwitterLoginButton) findViewById(R.id.twitter_login_button);
        loginButton.setCallback(new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> result) {
                // Do something with result, which provides a TwitterSession for making API calls
                String name = result.data.getUserName();
                Toast.makeText(MainActivity.this, "привет, " + name,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void failure(TwitterException exception) {
                // Do something on failure
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        loginButton.onActivityResult(requestCode, resultCode, data);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}



Билдим, запускаем, пробуем авторизоваться, все работает. Просто? да!

2. Лента твитов


Создадим новое активити на базе ListActivity и будем использовать уже имеющий в инструментарии, адаптер.

TweetsFeedActivity
public class TweetsActivity extends ListActivity {
    private TweetViewAdapter adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        adapter = new TweetViewAdapter(this);
        setListAdapter(adapter);
        loadTweets();
    }

    public void loadTweets() {
        final StatusesService service = Twitter.getInstance().getApiClient().getStatusesService();

        service.homeTimeline(null, null, null, null, null, null, null, new Callback<List<Tweet>>() {
                    @Override
                    public void success(Result<List<Tweet>> result) {
                        adapter.setTweets(result.data);
                    }

                    @Override
                    public void failure(TwitterException error) {
                        Toast.makeText(TweetsActivity.this, "Failed to retrieve timeline",
                                Toast.LENGTH_SHORT).show();
                    }
                }
        );
    }


Что получилось.

Отлично, идем дальше.

3. Пишем свой твит


Идем в javadoc для этого метода и смотрим:
javadoc
  /**
 * Updates the authenticating user's current status, also known as tweeting.
 * <p>
 * For each update attempt, the update text is compared with the authenticating user's recent
 * tweets. Any attempt that would result in duplication will be blocked, resulting in a 403
 * error. Therefore, a user cannot submit the same status twice in a row.
 * <p>
 * While not rate limited by the API a user is limited in the number of tweets they can create
 * at a time. If the number of updates posted by the user reaches the current allowed limit this
 * method will return an HTTP 403 error.
 *
 * @param status (required) The text of your status update, typically up to 140 characters. URL
 *               encode as necessary. [node:840,title="t.co link wrapping"] may effect character
 *               counts. There are some special commands in this field to be aware of. For
 *               instance, preceding a message with "D " or "M " and following it with a screen
 *               name can create a direct message to that user if the relationship allows for
 *               it.
 * @param inReplyToStatusId (optional) The ID of an existing status that the update is in reply
 *                          to. Note:: This parameter will be ignored unless the author of the
 *                          tweet this parameter references is mentioned within the status text.
 *                          Therefore, you must include @username, where username is the author
 *                          of the referenced tweet, within the update.
 * @param possiblySensitive (optional) If you upload Tweet media that might be considered
 *                          sensitive content such as nudity, violence, or medical procedures,
 *                          you should set this value to true. See Media setting and best
 *                          practices for more context. Defaults to false.
 * @param latitude (optional) The latitude of the location this tweet refers to. This parameter
 *                 will be ignored unless it is inside the range -90.0 to +90.0 (North is
 *                 positive) inclusive. It will also be ignored if there isn't a corresponding
 *                 long parameter.
 * @param longitude (optional) The longitude of the location this tweet refers to. The valid
 *                  ranges for longitude is -180.0 to +180.0 (East is positive) inclusive. This
 *                  parameter will be ignored if outside that range, if it is not a number, if
 *                  geo_enabled is disabled, or if there not a corresponding lat parameter.
 * @param placeId (optional) A place in the world. These IDs can be retrieved from [node:29].
 * @param displayCoordinates (optional) Whether or not to put a pin on the exact coordinates a
 *                           tweet has been sent from.
 * @param trimUser (optional) When set to either true, t or 1, each tweet returned in a timeline
 *                 will include a user object including only the status authors numerical ID.
 *                 Omit this parameter to receive the complete user object.
 * @param cb The callback to invoke when the request completes.
 */
@FormUrlEncoded
@POST("/1.1/statuses/update.json")
void update(@Field("status") String status,
       @Field("in_reply_to_status_id") Long inReplyToStatusId,
       @Field("possibly_sensitive") Boolean possiblySensitive,
       @Field("lat") Double latitude,
       @Field("long") Double longitude,
       @Field("place_id") String placeId,
       @Field("display_cooridnates") Boolean displayCoordinates,
       @Field("trim_user") Boolean trimUser,
       Callback<Tweet> cb);


Видим, что единственный обязательный параметр — status. Окей, пишем метод:

private void publishTweet() {
        final StatusesService statusesService = Twitter.getInstance().getApiClient().getStatusesService();
        statusesService.update("Привет хабр!", null, null, null, null, null, null, null, new Callback<Tweet>() {
            @Override
            public void success(Result<Tweet> tweetResult) {
                Toast.makeText(TweetsActivity.this, "Успешно опубликовали статус",
                        Toast.LENGTH_SHORT).show();
            }

            @Override
            public void failure(TwitterException e) {
                Toast.makeText(TweetsActivity.this, "Ошибка при отправке твита",
                        Toast.LENGTH_SHORT).show();
            }
        });
    }

Надо заметить, что в нынешней версии добавить к твиту фотографию нельзя. Придется подождать.

4. Logout

Просто добавим
                Twitter.getSessionManager().clearActiveSession();


И он прервет текущую сессию.

Ссылка на репозиторий: github.com/afeozzz/fabric-testApp

Если сравнивать с тем, какие костыли приходились делать раньше даже с этими 4 функциями, то можно смело сделать вывод, что разработчики Fabric довольно сильно упростили жизнь разработчикам.
Share post

Comments 14

    +13
    Раз вы делаете одну из первых русскоязычных публикаций по нему, то хотя бы рассказали, что это за зверь такой?
      –4
      Пока руки дошли только до Twitter Kit. Fabric очень мощная платформа, которая объединяет все их предыдущие SDK. Планирую в скором времени написать про всего его особенности и не только.
        +12
        да вы б хоть пару строчек, а то я впервые слышу о Twitter Kit, Twitter Fabric и какие-то их SDK O_O. И вообще, не представляю, для чего они
          0
          Вот сайт: dev.twitter.com/products/fabric

          Тряпка объединяет 7 SDK в три набора: крашлитикс (крашрепорты), твиттер (логиниться, постить твиты, юзать твиттер апи), мопаб (реклама).
      +6
      Для тех, кто не знает, что это такое:
      Fabric — это набор SDK для разработки мобильных приложений с использованием сервисов Twitter или купленными ими, итак сейчас есть три Kit:

      • Crashlytics Kit (сrashlytics.com)
      • Twitter Kit (twitter.com)
      • MoPub Kit (mopub.com)


      И несколько SDK, которые предоставляют Kit:
      • Crashlytics SDK (тут сразу несколько внутренних сервисов, бета-тестирование, логирование и статистика)
      • Twitter SDK (авторивация, публикация, просмотр твитов-карточек)
      • Digits SDK (авторизация в Twitter по номеру телефона)
      • MoPub SDK (рекламная сеть)


      Правда у меня Crashlytics перестал работать при подключении через Fabric.
        0
        А с помощью digits можно только в Твиттере авторизоваться? Я, почему-то, думал, что это сервис с помощью которого можно делать смс-авторизацию для своих приложений, не через Твиттер.
          0
          По описанию я понял, что только для Twitter.
            0
            Нет, конечно. Это авторизация для веб и приложений по SMS — ну, фактически, по номеру телефона.
              0
              В описании сказано, что иметь twitter аккаунт обязательно, а дальше как oauth.
                +1
                Нет, вроде не сказано:

                Digits won’t post anything on your user’s behalf since it isn’t tied to their social network accounts, including Twitter.

                Как раз чтобы избежать всех гемороев oauth это и сделано.
          0
          «Правда у меня Crashlytics перестал работать при подключении через Fabric.»
          Что-то сделали не так, отлично работает. Если не получится разобраться напишите им в саппорт, очень отзывчивые ребята.
            0
            Судя по всему проблема с multidex, а в саппорте на форуме уже вторую неделю без ответа.
              0
              Да, multidex еще довольно сырой, вполне возможно что он влияет, но если у вас работал не через fabric, то довольно странно.
              У них есть email саппорт, который отвечает довольно быстро, попробйте туда написать, на сайте внизу форма contact.
                0
                внизу, вмысле на сайте crashlytics.com

        Only users with full accounts can post comments. Log in, please.