В рамках этого практического задания предлагается сделать небольшое приложение, использующее SDK социальной сети ВКонтакте для выполнения авторизации и нескольких несложных запросов. Работа с SDK описана на странице официально документациий для разработчиков ВКонтакте: https://vk.com/dev/android_sdk -- и в процессе выполнения этого задания надо будет ознакомиться с ней и выполнить описанные в ней инструкции. В результате получится приложение, зарегистрированное для работы с ВКонтакте, которое можно будет использовать в качестве основы для реализации функций интеграции с социальной сетью, если такие функции понадобятся, к примеру, в курсовом проекте.
Первый экран приложения (MainActivity
) содержит только кнопку "Войти через ВКонтакте", по нажатию на которую открывается второй экран.
Второй экран приложения (VkDemoActivity
) при старте проверят, был ли пользователь приложения ранее уже авторизован во ВКонтакте, и если нет -- выполняет авторизацию при помощи Vk SDK. В процессе этой авторизации может быть показан либо экран приложения ВКонтакте, если оно установлено на устройстве, либо страница мобильного сайта ВКонтакте, показанная в WebView внутри приложения. После успешной авторизации выполняется запрос информации о пользовтеле и показывается его фотография и имя. По нажатию на кнопку "Выйти" происходит выход на первый экран, чтобы можно было снова залогиниться тем же или другим пользователем.
![]() |
![]() |
Код первого экрана уже реализован, а код второго экрана надо написать в классе VkDemoActivity
в рамках этого задания.
Для того, чтобы можно было использовать функции Vk SDK в нашем приложении, нужно выполнить инструкции, описанные здесь: https://vk.com/dev/android_sdk
Подробнее по шагам:
ID Anroid приложения указывается в файле build.gradle
в модуле приложения. По этому ID приложения идентифицируются, например, в магазине приложений Google Play, а в нашем случае он нужен для идентификации приложения в API ВКонтакте. У двух приложений ID не может быть одинаковым, поэтому вам следует поменять ID, который сейчас прописан в исходном коде задания.
Найдите в файле app/build.gradle
строчку, содержащую applicationId "ru.ifmo.droid2016.vkdemo"
и замените этот ID на свой новый уникальный ID. Можно просто добавить в конце свою фамилию или другое уникальное слово.
Следуя инструкции https://vk.com/dev/android_sdk?f=1.1%20%D0%9E%D1%82%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%BE%D0%BA%20%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%B0, определить отпечаток сертификата, установленного на компьютере, который вы используете для разработки. Это делается при помощи утилиты keytool
, которая входит в состам JDK. В процессе выполнения задания нужно использовать debug сертификат (не release). Команда для получения сертификата выглядит приблизительно так (на Windows):
keytool -exportcert -alias androiddebugkey -keystore C:/Users/<имя пользователя Windows>/.android/debug.keystore -list -v
Дефолтный пароль для keystore: android
В выводе этой команды надо найти строчку вида
SHA1: CD:4C:07:48:CD:1A:D0:63:DB:43:9F:57:24:5A:49:90:C7:33:21:8E
Из которой надо взять шестнадцатеричное значение, удалив все двоеточия -- это и будет отпечаток сертификата, как он используется для идентификации приложения в API ВКонтакте: CD4C0748CD1AD063DB439F57245A4990C733218E
.
- Зайти на страницу для разработчиков ВКонтакте: https://vk.com/dev
- Нажать "Создать приложение"
- Ввести любое название приложения, выбрать вариант "Standalone" и нажать "Подключить приложение"
- Пройти предложенную верификацию (через приложение или SMS -- как вам нравится)
- После успешной верификации зайти в настройки зарегистрированного приложения и получить там ID приложения
- Там же в настройках приложения ввести
- Android application ID (которое вы прописали в
app/build.gradle
) - Название активности
ru.ifmo.droid2016.vkdemo.VkDemoActivity
- Ваш отпечаток сертификата (полученный ранее при помощи keytool)
- Android application ID (которое вы прописали в
- Не забыть нажать "Сохранить изменения"
Следовать дальше инструкциям https://vk.com/dev/android_sdk?f=2.%20%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%20%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8
- Указать зависимость на Vk SDK в файле
app/build.gradle
, добавив строчку в раздел dependencies (это пункт 2.1 инструкций, пункты 2.2 - 2.4 пропустить):
compile 'com.vk:androidsdk:1.6.7'
- В файл
app/src/main/AndroidManifest.xml
добавить рарешение на доступ в Интернет:
<uses-permission android:name="android.permission.INTERNET" />
- Туда же в манифесте добавить запись об активности, которая используется Vk SDK для OAuth авторизации:
<activity
android:name="com.vk.sdk.VKServiceActivity"
android:label="ServiceActivity"
android:theme="@style/VK.Transparent" />
- Создать файл ресурсов
vk.xml
в папкеapp/src/main/res/values
и прописать в нем ID приложения, полученный при регистрации приложения в API Вконтакте:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="com_vk_sdk_AppId">ID приложения, зарегистрированного в API ВКонтакте</integer>
</resources>
- В коде
VkDemoApplication.onCreate
добавить инициализацию Vk SDK:
VKSdk.initialize(this);
После выполнения этой части задания приложение готово к использованию функционала Vk SDK, однако видимого результата не видно -- еще никакой полезный код не написан. Можно убедиться, что приложение собирается и запускается.
Следуя инструкции https://vk.com/dev/android_sdk?f=3.2.%20%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F выполнить авторизацию пользователя во ВКонтакте.
- Авторизация должна инициироваться из
VkDemoActivity.onCreate
- В качестве параметра
scope
можно для начала использоватьVKScopes.PHOTOS
для доступа к фотографиям пользователя - Код, обрабатывающий результат логина, должен быть написан в
VkDemoActivity.onActivityResult
- В случае успешного логина вызвать метод
VkDemoActivity.onLoggedIn(VKAccessToken token)
- В случае неуспешного логина вызвать метод
VkDemoActivity.onLoginFailed(VKError error)
Если все работает правильно, то после логина должно быть показано короткое сообщение (тост) о результате логина.
Для того, чтобы не вызывать процедуру авторизации при каждом запуске приложения, токен можно сохранить в настройки и использовать при следующем запуске приложения:
- Сохранять токен следует при помощи вызова
token.saveTokenToSharedPreferences(VkDemoActivity.this, Constants.KEY_TOKEN)
- Получить ранее сохраненный токен можно при помощи вызова
VKAccessToken.tokenFromSharedPreferences(this, Constants.KEY_TOKEN)
После успешного логина можно выполнять запросы к API Вконтакте при помощи Vk SDK. При этом не понадобится писать код, выполняющий HTTP запросы или код JSON-парсеров -- все это берет на себя Vk SDK.
Мы хотим запросить информацию о текущем залогиненном пользователе при помощи запроса users.get и из полученного ответа извлечь имя пользователя и URL его фотографии, и отобразить их на экране. Для отображения имени в верстке и в коде VkDemoActivity
уже есть элемент:
private TextView nameView;
а для фотографии:
private SimpleDraweeView imageView;
Принцип выполнения запросов к API Вконтакте описан здесь: https://vk.com/dev/android_sdk?f=4.%20%D0%92%D1%8B%D0%B7%D0%BE%D0%B2%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2%20API. Запрос должен выполняться асинхронно в фоновом потоке, а результат должен обрабатываться в основном (main) потоке. Для асинхронного выполнения запроса можно использовать вызов VKRequest.executeWithListener
- но тогда придется подумать о том, как сохранить результат выполнения запроса при смене конфигурации, чтобы при повороте экрана не выполнять запрос снова. Другой вариант -- использовать механизм AsyncTaskLoader, и в нем в методе loadInBackground
выполнять запрос при помощи вызова VKRequest.executeSyncWithListener
.
- В методе
VkDemoActivity.onLoggedIn(VKAccessToken token)
написать код, который запустит асинхронное выполнение запроса users.get без параметра user_ids (запрос информации о текущем пользователе). - Чтобы самим не писать парсер, нужно у объекта запроса
VKRequest
перед выполнением запроса вызвать метод:
request.setModelClass(VKUsersArray.class);
тогда готовая модель ответа типа VKUsersArray
окажется в поле ответа VKResponse.parsedModel
.
- При получении результата выполнения запроса отобразить имя и фото пользователя, либо сообщение об ошибке.
Можно продолжить экспериментировать с Vk SDK и выполнить какие-нибудь еще запросы. Например, можно запросить список друзей при помощи метода friends.get и показать его в отдельном экране при помощи RecyclerView
.