0,0
рейтинг
22 января 2014 в 20:12

Разработка → Вконтакте представили SDK для Android из песочницы

API*
ВКонтакте представили SDK для Android

На днях ВКонтакте в разделе для разработчиков выложили 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 можно почитать здесь.

Спасибо за внимание.
Александр @alex_xpert
карма
9,0
рейтинг 0,0
Java Developer
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (14)

  • –10
    Вот блин, хотел написать такой же пост
    • +1
      Ладно-ладно, не хотел. Но уточнить таки должен, что useSystemLanguage это не то, что описал автор статьи. Вы можете установить значение preferredLang, и запросы будут возвращать данные с этим языком. useSystemLanguage сигнализирует, что нужно использовать язык системы в запросах
      • 0
        Что вы накликали минусов то сразу человеку? Насколько я понял, этот человек если и не непосредственный автор, всё равно явно причастен к сабжу поста. И уже этим заслуживает определенного уважения.
        • 0
          Неудачно пошутил :]
      • 0
        Кстати mPrefferedLang — приватное поле
        • 0
          setPreferredLang — отменяет useSystemLanguage и ставит двухбуквенный язык, правда пока что проверки на доступность данного языка нет
  • –4
    iOS SKD тоже тут github.com/VKCOM/vk-ios-sdk
  • +17
    А чем вы активности запускаете обычно? Намерениями?
    • –2
      Намерениями?


      извиняюсь конечно, но глаз режет.
      • +4
        А «активности» не режут, капитан?
  • +3
    Мне кажется или вы не заметили пару вызовов в слушателе sdk?
  • 0
    Прощайте post-запросы, привет полноценное SDK. Дождались-таки.
  • 0
    Лучше все таки пользоваться REST API, чем этим ужасом
  • 0
    Лучше всё-таки перестать мечтать о блюдечке с голубой каемочкой.
    Рад за тех счастливчиков, которых обошел стороной настоящий говнокод.

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