На днях ВКонтакте в разделе для разработчиков выложили SDK для Android.
Популярная социальная сеть ВКонтакте пополнила свой набор инструментариев для разработки приложений, в котором уже имеются Flash и Javascript SDK, а также SDK для iOS, еще одним — SDK для Android.
Эта библиотека включает в себя инструменты для авторизации, как при наличии на девайсе пользователя официального клиента, так и при его отсутствии, а также инструменты для облегчения составления/выполнения запросов и обработки ответов.
Не забыли ребята и о владельцах девайсов с неактуальными версиями Android на борту — тестовое приложение, поставляемое вместе с SDK, имеет требования Android 2.2+
Также не оставлен без внимания вопрос защиты.
Подробности под катом.
Где взять?
VK Android SDK доступен для скачивания на GitHub.
Как подключить?
SDK к проекту
В Eclipse, которым, к слову, я пользуюсь, а также в Android Studio, с использованием сборщика Gradle, VK SDK подключается также, как и любая другая библиотека, поэтому не стану на этом останавливаться. Скажу только, что для удобства я изменил структуру папок:
=>
Если же вы не используете Gradle в Android Studio, то следует переименовать подключаемый модуль из «main» в «vksdk».
В манифесте необходимо прописать activity com.vk.sdk.VKOpenAuthActivity.
Проект к ВКонтакте
Разработчики создали систему безопасности, благодаря которой другое приложение не сможет выдать себя за ваше.
- Во-первых, после создания standalone-приложения, в его настройках вы должны указать название пакета.
- Во-вторых, вы должны указать в настройках имя главной activity вашего приложения.
- В-третьих (это самое главное), вы должны указать отпечаток ключа вашего приложения, предварительно удалив двоеточия. Можно несколько, например, debug и release. Утилита keytool выдала мне три отпечатка — MD5, SHA1 и SHA256. ВКонтакт интересует SHA1.
Как использовать?
Авторизация
При запуске приложения нужно инициализировать SDK:
VKSdk.initialize(VKSdkListener listener, String appId, VKAccessToken token);
Авторизацию рекомендуется производить одним из следующих способов:
VKSdk.authorize(String... scope);
VKSdk.authorize(String[] scope, boolean revoke, boolean forceOAuth);
По умолчанию авторизация происходит через вконтакте клиент. Если оный на девайсе пользователя не установлен или forceOAuth == true, то страница авторизации открывается в отдельной activity.
Поскольку библиотека включает элементы интерфейса, то ей необходимо отслеживать происходящее на дисплее. Для этого используется класс VKUIHelper. Поэтому во всех activity нужно переопределить методы примерно так:
@Override
protected void onResume() {
super.onResume();
VKUIHelper.onResume(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
VKUIHelper.onDestroy(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
VKUIHelper.onActivityResult(requestCode, resultCode, data);
}
Пример activity:
public class LoginActivity extends Activity {
private static String sTokenKey = "VK_ACCESS_TOKEN";
private static String[] sMyScope = new String[]{VKScope.FRIENDS, VKScope.WALL, VKScope.PHOTOS, VKScope.NOHTTPS};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
VKSdk.initialize(sdkListener, "id_приложения", VKAccessToken.tokenFromSharedPreferences(this, sTokenKey));
setContentView(R.layout.activity_login);
VKSdk.authorize(sMyScope, true, false);
}
@Override
protected void onResume() {
super.onResume();
VKUIHelper.onResume(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
VKUIHelper.onDestroy(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
VKUIHelper.onActivityResult(requestCode, resultCode, data);
}
private VKSdkListener sdkListener = new VKSdkListener() {
@Override
public void onCaptchaError(VKError captchaError) {
new VKCaptchaDialog(captchaError).show();
}
@Override
public void onTokenExpired(VKAccessToken expiredToken) {
VKSdk.authorize(sMyScope);
}
@Override
public void onAccessDenied(VKError authorizationError) {
new AlertDialog.Builder(LoginActivity.this)
.setMessage(authorizationError.errorMessage)
.show();
}
@Override
public void onReceiveNewToken(VKAccessToken newToken) {
newToken.saveTokenToSharedPreferences(LoginActivity.this, sTokenKey);
Intent i = new Intent(LoginActivity.this, MainActivity.class);
startActivity(i);
}
@Override
public void onAcceptUserToken(VKAccessToken token) {
Intent i = new Intent(LoginActivity.this, MainActivity.class);
startActivity(i);
}
};
}
Выполнение запросов
Можно составить запрос, используя имеющуюся в SDK модель:
VKRequest request = VKApi.users().get();
Или непосредственно указать имя вызываемого метода:
VKRequest request = new VKRequest("status.get");
То же самое с параметрами:
VKRequest request = VKApi.users().get(VKParameters.from(VKApiConst.USER_IDS, "1,2"));
VKRequest request = new VKRequest("friends.get", VKParameters.from(VKApiConst.FIELDS, "sex,bdate,city"));
Для загрузки фотографий предусмотрены специальные типы запроса — VKUploadAlbumPhotoRequest для загрузки в альбом и VKUploadWallPhotoRequest для загрузки на стену. Оба имеют по два конструктора:
VKRequest request = VKApi.uploadWallPhotoRequest(VKUploadImage image, int user_id, int group_id);
VKRequest request = VKApi.uploadAlbumPhotoRequest(VKUploadImage image, int album_id, int group_id);
VKRequest request = VKApi.uploadWallPhotoRequest(File image, int user_id, int group_id);
VKRequest request = VKApi.uploadAlbumPhotoRequest(File image, int album_id, int group_id);
При загрузке фото на свою стену или стену группы user_id == 0, иначе — id пользователя, на стену которого будем
При загрузке фото на стену/в альбом группы group_id == id целевой группы, иначе group_id == 0 (например, загрузка фото в свой альбом).
В album_id, соответственно, идентификатор фотоальбома.
Что касается объекта VKUploadImage, то в его конструктор необходимо передать изображение в виде объекта Bitmap и объект VKImageParameters, представляющий тип изображения (png, jpg) и значение quality (для jpg).
Аналоги для аудиозаписей, видеозаписей и документов пока не реализованы, но я не вижу проблем с тем, чтобы сделать это самостоятельно. :-)
Перед выполнением запроса можно изменить некоторые его параметры:
// Количество попыток выполение запроса. В случае успешного результата или API Error оставшиеся попытки сбрасываются.
// Дефолтное значение: 1. Значение 0 соответствует infinity.
request.attempts = 0;
// Использование защищенного соединения (HTTPS).
// Значение false можно использовать только при наличии соответствующего scope (nohttps).
// Дефолтное значение: true.
request.secure = false;
// Язык интерфейса вконтакте (при авторизации).
// Если установлено значение false или системный язык не поддерживается - будет использован английский язык.
// Дефолтное значение: true.
useSystemLanguage = false;
// Значение false отключает автоматический парсинг ответа сервера с использованием модели, имеющейся в SDK.
// Дефолтное значение: true.
request.parseModel = false;
Выполняется запрос методом
request.executeWithListener(VKRequestListener listener);
Ответ сервера (VKResponse) приходит в listener.
Пример оправки запроса:
request.executeWithListener(new VKRequestListener() {
@Override
public void onComplete(VKResponse response) {
// Здесь обрабатываем полученный response.
}
@Override
public void onError(VKError error) {
// Ошибка. Сообщаем пользователю об error.
}
@Override
public void attemptFailed(VKRequest request, int attemptNumber, int totalAttempts) {
// Неудачная попытка. В аргументах имеется номер попытки и общее их количество.
}
});
Можно выполнить несколько запросов одним пакетом. Для этого создаем, так сказать, мультизапрос:
VKBatchRequest batch_req = new VKBatchRequest(VKRequest... requests);
Как видите, в одном пакете может быть любое количество запросов.
Выполняется мультизапрос также, как и единичный, только с другим слушателем:
batch_req.executeWithListener(new VKBatchRequestListener() {
@Override
public void onComplete(VKResponse[] responses) {
// Здесь обрабатываем responses (они в том же порядке, в котором были указаны запросы)
}
@Override
public void onError(VKError error) {
// Ошибка. Сообщаем пользователю об error.
}
});
Обработка ответов
Если в ответе ожидается объект, Java-представления которого пока нет в модели SDK, имеет смысл установить
parseModel = false;
и самостоятельно обрабатывать полученный JSON. Иначе достаточно привести полученный объект к необходимому типу.Заключение
SDK Вконтакте для Android — довольно удобный и элегантный инструмент. Однако, конечно, ещё сырой. Файл-менеджмент пока представляет собой только загрузку фото. Аудио-, видеозаписи и документы пока в пролёте. Модель пока включает только Java-представления пользователя и фотографии. Однако уже имеются средства обработки капчи и ошибки валидации.
Библиотеке есть куда развиваться — а это значит, что можно в этом поучаствовать и вписаться в историю ВКонтакте.
Официальную документацию по SDK для Android можно почитать здесь.
Спасибо за внимание.