Урок 14. Регистрация Twitter приложения, добавление авторизации, используя twitter-библиотеку – Devcolibri – Android для начинающих

Урок 14. Регистрация Twitter приложения, добавление авторизации, используя twitter-библиотеку

Регистрация Twitter приложения

Для того, чтобы использовать twitter api необходимо зарегистрировать приложение. Для этого надо перейти по ссылке, войти в аккаунт (создать, если нет) и нажать кнопку Create New App. Далее необходимо заполнить поля нашего приложения.

 

ApplicationInfo.png

 

  • Поля namedescription придумаем сами, они нигде не будут видны, кроме как в вашей учётной записи в твиттере.
  • В качестве Website можем указать любой несуществующий, но, если у вас есть сайт, то можете указать ваш.
  • Параметр Callback URL нужен для веб-приложений, поэтому вместо него можем также ввести любой сайт.

 

ApplicationAgreement.png

 

После этого ставим галочку, что согласны с условиями пользования и нажимаем кнопку Create your Twitter application. Видим информацию о нашем приложении. Если понадобится, то можно изменить поля в любое время.

 

ApplicationCreated.png

 

Далее нажимаем на вкладку Keys and Access Tokens. Увидим следующую форму:

 

ApplicationKeys.png

 

Чёрным прямоугольником закрашена информация о нашем аккаунте в целях безопасности. Также надо было поступить и с полями Consumer Key (API Key) и Consumer Secret (API Secret), но мы их просто сгенерируем заново, чтобы использовать эти данные в уроке. Не показывайте никому эти поля, это небезопасно.

Скопирум поля Consumer Key (API Key) и Consumer Secret (API Secret). Они однозначно идентифицируют наше приложение и будут учитываться при его авторизации.

Поле Access Level должно иметь значение Read and write. Это говорит о том, что мы сможем как считывать информацию о пользователе, так и добавлять новую.

Добавление twitter-kit библиотеки в наше приложение

Для начала добавим twitter-kit библиотеку в наш проект. Конечно, можно полностью обойтись без неё, но процесс авторизации – довольно сложная и неинтересная задача, которую создатели библиотеки значительно нам упростили. Поэтому мы подключаем эту библиотеку только для авторизации.

Нам надо добавить следующую строку в наш файл build.gradle(Module:app).

implementation 'com.twitter.sdk.android:twitter-core:3.1.1'

Давайте сразу же добавим два новых ресурса в наш файл strings.xml. Это и будут те значения Consumer Key (API Key) и Consumer Secret (API Secret), которые мы получили, когда регестрировали приложение. Они должны выглядить следующим образом. strings.xml

 

1
2
3
4
5
<resources>
    <!-- Остальные ресурсы не изменились -->
    <string name="com.twitter.sdk.android.CONSUMER_KEY">yHP7WOGyapkv7hlAsjO6zOURt</string>
    <string name="com.twitter.sdk.android.CONSUMER_SECRET">YZHL3AP029AO2ycdb0kTJ9Iz8Lb0v4cFsfKZRKdQaD2Cnckgtj</string>
</resources>

 

Вам вместо этих значений надо ввести те, которые вы получили при регистрации приложения. Библиотека twitter-kit автоматически получит эти значения, т.к. мы используем name ресурса, который указан в документации библиотеки.

Отлично, теперь мы подключили библиотеку. Для начала нам надо создать класс Application для того, чтобы могли проинициализировать библиотеку Twitter. Создадим файл TwitterApp в нашем главном пакете colibri.dev.com.colibritweet. Выглядит он следующим образом.

 

TwitterApp.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package colibri.dev.com.colibritweet;

import android.app.Application;

import com.twitter.sdk.android.core.Twitter;

public class TwitterApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Twitter.initialize(this);
    }
}

 

Всё, что нам надо сделать – проинициализировать библиотеку вызовом Twitter.initialize(this).

Также нам надо указать, что мы используем свой Application. Для этого надо в файле AndroidManifest добавить атрибут android:name=".TwitterApp" у блока application. Наш файл выглядит так после этого изменения:

 

AndroidManifest.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="colibri.dev.com.colibritweet">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:name=".TwitterApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".activity.UserInfoActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".activity.SearchUsersActivity"/>
    </application>

</manifest>

 

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

Добавим в пакет activity новый файл AuthActivity.

Также добавим нашу новую Activity в манифест и сделаем её стартовой.

 

AndroidManifest.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="colibri.dev.com.colibritweet">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:name=".TwitterApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".activity.AuthActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".activity.UserInfoActivity"/>
        <activity android:name=".activity.SearchUsersActivity"/>
    </application>

</manifest>

 

Видим, что теперь стартовой Activity является AuthActivity. На это указывает значение android.intent.category.LAUNCHER в блоке intent-filter.

Теперь давайте добавим layout для нашей активити. Создадим файл activity_auth.xml

 

activity_auth.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <com.twitter.sdk.android.core.identity.TwitterLoginButton
        android:id="@+id/login_button"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</FrameLayout>

 

Наш экран состоит из одной кнопки, которая будет выполнять всю логику авторизации. Изначально мы хотели сделать два EditText и Button, но Twitter не предоставляет логины и пароли пользователей сторонним сервисам. Они используют протокол OAuth для безопасной авторизации. Подробнее про протокол здесь.

Наш файл AuthActivity выглядит так:

 

AuthActivity.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package colibri.dev.com.colibritweet.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.Result;
import com.twitter.sdk.android.core.TwitterException;
import com.twitter.sdk.android.core.TwitterSession;
import com.twitter.sdk.android.core.identity.TwitterLoginButton;

import colibri.dev.com.colibritweet.R;


public class AuthActivity extends AppCompatActivity {
    private TwitterLoginButton mTwitterLoginButton;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_auth);
        mTwitterLoginButton = findViewById(R.id.login_button);

        mTwitterLoginButton.setCallback(new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> result) {

            }

            @Override
            public void failure(TwitterException exception) {

            }
        });
    }

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

 

Здесь мы просто добавили переменную типа TwitterLoginButton, которая будет выполнять за нас всю работу по авторизации приложения. Также мы добавили слушателя событий new Callback<TwitterSession>, у которого есть два метода:

  • success – вызывается при успешной авторизации пользователя
  • failure – вызывается при возникновении ошибки во время авторизации.

Также мы переопределили метод onActivityResult (если вам ещё не известно, для чего используется данный метод, то ознакомьтесь с данным уроком) и вызвали mTwitterLoginButton.onActivityResult. Это необходимо для того, чтобы результат авторизации передать из нашей Activity в объект mTwitterLoginButton.

Запустим приложение:

 

AuthActivity.png

 

После того, как нажмём кнопку Log in with Twitter, мы переходим на страницу авторизации пользователя, которая можем выглядеть по-разному. Если у вас есть мобильное приложение Twitter, то откроется мобильное приложение. Если нет, то браузер. У нас выглядит так:

 

UserAuthPage.png

 

Отлично, мы закончили с логикой авторизации. Давайте только после успешной авторизации сделаем переход на экран UserInfoActivity. При этом будем передавать idпользователя. Это нам понадобится для запроса данных о пользователе в следующем уроке. Давайте вынесем эту логику в отдельный метод navigateToUserInfo. Также давайте создадим константу USER_ID, чтобы мы могли ссылаться на неё внутри UserInfoActivity при получении данных.

 

AuthActivity.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public class AuthActivity extends AppCompatActivity {

    public static final String USER_ID = "userId";

    private void navigateToUserInfo(Long userId) {
        Intent intent = new Intent(AuthActivity.this, UserInfoActivity.class);
        intent.putExtra(USER_ID, userId);
        startActivity(intent);
    }
}

 

Этот метод мы будем вызывать внутри success обработчика mTwitterLoginButton. Полный код выглядит так:

 

AuthActivity.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package colibri.dev.com.colibritweet.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.Result;
import com.twitter.sdk.android.core.TwitterException;
import com.twitter.sdk.android.core.TwitterSession;
import com.twitter.sdk.android.core.identity.TwitterLoginButton;

import colibri.dev.com.colibritweet.R;


public class AuthActivity extends AppCompatActivity {
    public static final String USER_ID = "userId";
    private TwitterLoginButton mTwitterLoginButton;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_auth);
        mTwitterLoginButton = findViewById(R.id.login_button);

        mTwitterLoginButton.setCallback(new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> result) {
                // навигация на экран пользователя
                Long userId = result.data.getUserId();
                navigateToUserInfo(userId);
            }

            @Override
            public void failure(TwitterException exception) {

            }
        });
    }

    private void navigateToUserInfo(Long userId) {
        Intent intent = new Intent(AuthActivity.this, UserInfoActivity.class);
        intent.putExtra(USER_ID, userId);
        startActivity(intent);
    }

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

 

Давайте убедимся, что мы получили наши данные на экране UserInfoActivity.class. Для этого получим данные используя метод getIntent() и выведем id пользователя, используя (Toast).

Добавим код в метод onCreate в классе UserInfoActivity.

 

UserInfoActivity.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class UserInfoActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.user_info_layout);
        // остальной код выше не изменился
        long userId = getIntent().getLongExtra(AuthActivity.USER_ID, -1);
        Toast.makeText(this, "UserId = " + userId, Toast.LENGTH_SHORT).show();
    }

    // остальной код не изменился
} 

 

Ещё один момент. Помните, как мы делали навигацию на экране SearchUsersActivity:

 

SearchUsersActivity.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public class SearchUsersActivity extends AppCompatActivity {
    // остальной код выше не изменился
    private void initRecyclerView() {

        UsersAdapter.OnUserClickListener onUserClickListener = new UsersAdapter.OnUserClickListener() {
            @Override
            public void onUserClick(User user) {
                Intent intent = new Intent(SearchUsersActivity.this, UserInfoActivity.class);
                intent.putExtra("userId", user.getId());
                startActivity(intent);
            }
        };
        usersAdapter = new UsersAdapter(onUserClickListener);
        usersRecyclerView.setAdapter(usersAdapter);
    }
}

 

Правилом большого пальца является использование констант вместо явного использования строки "userId". Давайте заменим использование на константу AuthActivity.USER_ID.

 

SearchUsersActivity.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public class SearchUsersActivity extends AppCompatActivity {
    // остальной код выше не изменился
    private void initRecyclerView() {

        UsersAdapter.OnUserClickListener onUserClickListener = new UsersAdapter.OnUserClickListener() {
            @Override
            public void onUserClick(User user) {
                Intent intent = new Intent(SearchUsersActivity.this, UserInfoActivity.class);
                intent.putExtra(AuthActivity.USER_ID, user.getId());
                startActivity(intent);
            }
        };
        usersAdapter = new UsersAdapter(onUserClickListener);
        usersRecyclerView.setAdapter(usersAdapter);
    }
}

 

Результат:

 

AuthCompleted.png

 

Всё, с логикой авторизации мы завершили работу. Поздравляю! Впереди осталось совсем немного. Перед завершением урока давайте удалим строку, где мы показываем Toast, чтобы это не мешало нам во время дальнейшей работы.

Подведём итоги:

  • Для создания приложения Twitter приложения нам в первую очередь необходимо зарегистрировать его на сайте.
  • Для работы с Twitter api необходимо пройти авторизацию. Для простоты можно использовать библиотеку twitter-kit
УВИДЕТЬ ВСЕ Добавить заметку
Вы
Добавить ваш комментарий
 

Сайт использует cookie-файлы для того, чтобы вам было удобнее им пользоваться. Для продолжения работы с сайтом, вам необходимо принять использование cookie-файлов.

Я ознакомлен(а)