Перед началом работы с VK SDK необходимо создать
Standalone-приложение на
странице создания приложения. Сохраните ID Вашего приложения и заполните поля «Название пакета для Android»,«Main Activity для Android», «Отпечаток сертификата для Android».
Для получения отпечатка Вашего сертификата можно воспользоваться одним из следующих способов.
1) Необходимо определить местоположение хранилища для приложения. Хранилище ключей для отладки (debug) обычно находится в одной из этих директорий:
- ~/.android/ для OS X и Linux,
- C:\Documents and Settings\<user>\.android\ для Windows XP,
- C:\Users\<user>\.android\ для Windows Vista, Windows 7 и Windows 8.
Хранилище для release версии обычно создаётся разработчиком.
2) После того, как Вы определили местоположение Вашего хранилища, используйте утилиту keytool (поставляемую совместно с Java SDK). Получите список ключей следующей командой:
keytool -exportcert -alias androiddebugkey -keystore path-to-debug-or-production-keystore -list -v
Вы должны увидеть нечто вроде
Certificate fingerprint: SHA1: DA:39:A3:EE:5E:6B:4B:0D:32:55:BF:EF:95:60:18:90:AF:D8:07:09
Удалив все двоеточия, Вы получите отпечаток своего ключа.
Если Вы уже добавили SDK в свой проект, можно использовать следующую функцию в любой
Activity Вашего приложения.
String[] fingerprints = VKUtil.getCertificateFingerprint(this, this.getPackageName());
Как правило,
fingerprints содержит одну строку, которая будет отпечатком Вашего сертификата (в зависимости от того, каким сертификатом было подписано приложение).
В настройках приложения можно добавить несколько отпечатков, например, debug и release.
Мы отдаём предпочтение Android Studio, поэтому ориентируемся, в первую очередь, на него.
androidsdk on Maven
Вы можете добавить в свой проект следующую maven-зависимость:
com.vk:androidsdk:[MAVEN_CENTRAL_VERSION]
К примеру, Ваш gradle скрипт будет содержать следующие зависимости:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:20.0.0'
compile 'com.vk:androidsdk:1.6.5'
}
Вы можете добавить библиотеку в Ваш проект с использованием Gradle:
1) Скопируйте директорию
vksdk_library в директорию Вашего проекта.
2) Найдите
settings.gradle.
Скорее всего, он содержит что-то вроде
include ':app'
Отредактируйте строку следующим образом:
include ':vksdk_library',':app'
3) Ваш проект теперь содержит модуль
vksdk_library. Необходимо добавить его как зависимость к Вашему приложению. Найдите
build.gradle в поддиректории модуля Вашего приложения (например YOUR_PROJECT/app/build.gradle)
Добавьте новую строку в
dependencies.
compile project(':vksdk_library')
Ваш файл может выглядеть примерно так:
Если Ваш проект не поддерживает Gradle, добавить SDK можно следующим образом:
- Откройте Project Settings и выберите Modules.
- Нажмите кнопку «Добавить» (+), и выберите Import module
- Найдите директорию с VK SDK и выберите vksdk_library, нажмите «Добавить».
- Выберите Create module from existing sources, затем два раза нажмите "Next" и переименуйте модуль из "main" в "vksdk", снова нажмите "next".
- Добавьте новый модуль vksdk зависимостью к модулю Вашего приложения.
- В Package explorer нажмите правую кнопку мыши, затем Import.
- Выберите Android/Existing android code into workspace.
- Найдите папку с SDK, выберите vksdk_library.
- Откройте Properties нового проекта vksdk_library, далее Java build path, Add folder, и выберите java.
- В Properties Вашего приложения перейдите в Android, в секции library добавьте новую библиотеку vksdk_library.
Необходимо добавить в Ваш манифест следующие элементы:
1) в корень
<manifest> необходимо добавить разрешение
<uses-permission android:name="android.permission.INTERNET" />
2) в
<application> стоит добавить
<activity android:name="com.vk.sdk.VKServiceActivity" android:label="ServiceActivity" android:theme="@style/VK.Transparent" />
иначе могут быть проблемы с запуском авторизационной activity.
1) Необходимо добавить в файл ресурсов (например strings.xml) информацию о ID Вашего приложения
<integer name="com_vk_sdk_AppId">YOUR_APP_ID</integer>
2) Необходимо инициализировать SDK при запуске приложения следующим методом, лучше всего это делать в методе
onCreate Вашего
Application VKSdk.initialize(Context applicationContext);
Если у пользователя установлено приложение ВКонтакте, то авторизация пройдет через него без ввода логина и пароля.
Для авторизации есть несколько методов:
VKSdk.login(Activity runningActivity, String... scope);
VKSdk.login(Fragment runningFragment, String... scope);
Если у пользователя не установлено приложение ВКонтакте, то SDK будет использовать авторизацию через новую Activity при помощи OAuth.
После этапа авторизации в Вашем
Activity или
Fragment будет вызван метод
onActivityResult. Пример обработки приведен ниже
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!VKSdk.onActivityResult(requestCode, resultCode, data, new VKCallback<VKAccessToken>() {
@Override
public void onResult(VKAccessToken res) {
// Пользователь успешно авторизовался
}
@Override
public void onError(VKError error) {
// Произошла ошибка авторизации (например, пользователь запретил авторизацию)
}
})) {
super.onActivityResult(requestCode, resultCode, data);
}
}
Для обработки ситуаций, когда
AccessToken становится невалиден (например, пользователь сменил пароль) необходимо использовать
VKAccessTokenTracker как показано в примере ниже
public class Application extends android.app.Application {
VKAccessTokenTracker vkAccessTokenTracker = new VKAccessTokenTracker() {
@Override
public void onVKAccessTokenChanged(VKAccessToken oldToken, VKAccessToken newToken) {
if (newToken == null) {
// VKAccessToken is invalid
}
}
};
@Override
public void onCreate() {
super.onCreate();
vkAccessTokenTracker.startTracking();
VKSdk.initialize(this);
}
}
Для доступа к API можно использовать как встроенные в SDK методы, так и получив access_token
использовать свою библиотеку.
1) Простой запрос.
VKRequest request = VKApi.users().get();
2) Запрос с параметрами.
VKRequest request = VKApi.users().get(VKParameters.from(VKApiConst.USER_IDS, "1,2"));
3) Вариант с http загрузкой (если при авторизации в scope был передан VK_PER_NOHTTPS).
VKRequest request = VKApi.users().get(VKParameters.from(VKApiConst.USER_IDS, "1,2"));
request.secure = NO;
4) Запрос с количеством повторений.
VKRequest request = VKApi.wall().post(VKParameters.from(VKApiConst.OWNER_ID, "-60479154", VKApiConst.MESSAGE, "Привет, друзья!"));
request.attempts = 10;
//or infinite
//postReq.attempts = 0;
Будет выполнено 10 запросов, пока не произойдет успех, или не будет возвращен API error
5) Загрузка произвольного
метода API (нужно иметь в виду полученный
scope).
VKRequest request = new VKRequest("friends.get", VKParameters.from(VKApiConst.FIELDS, "sex,bdate,city"));
6)
Загрузка фото на сервера VK.
final Bitmap photo = getPhoto();
VKRequest request = VKApi.uploadWallPhotoRequest(new VKUploadImage(photo, VKImageParameters.jpgImage(0.9f)), 0, 60479154);
request.executeWithListener(new VKRequestListener() {
@Override
public void onComplete(VKResponse response) {
//Do complete stuff
}
@Override
public void onError(VKError error) {
//Do error stuff
}
@Override
public void attemptFailed(VKRequest request, int attemptNumber, int totalAttempts) {
//I don't really believe in progress
}
});
SDK предусматривает возможность выполнения нескольких методов в один запрос.
1) Подготавливаются необходимые запросы:
VKRequest request1 = VKApi.uploadWallPhotoRequest(new VKUploadImage(photo1, VKImageParameters.jpgImage(0.9f)), 0, 60479154);
VKRequest request2 = VKApi.uploadWallPhotoRequest(new VKUploadImage(photo2, VKImageParameters.jpgImage(0.5f)), 0, 60479154);
VKRequest request3 = VKApi.uploadWallPhotoRequest(new VKUploadImage(photo3, VKImageParameters.jpgImage(0.1f)), 0, 60479154);
VKRequest request4 = VKApi.uploadWallPhotoRequest(new VKUploadImage(photo4, VKImageParameters.pngImage()), 0, 60479154);
2) Необходимые запросы объединяются в один.
VKBatchRequest batch = new VKBatchRequest(request1, request2, request3, request4);
3) Запрос загружается стандартным путём.
batch.executeWithListener(new VKBatchRequestListener() {
@Override
public void onComplete(VKResponse[] responses) {
super.onComplete(responses);
String[] photos = new String[responses.length];
for (int i = 0; i < responses.length; i++) {
VKPhoto photoModel = ((VKPhotoArray) responses[i].parsedModel).get(0);
photos[i] = String.format("photo%s_%s", photoModel.owner_id, photoModel.id);
}
makePost(VKStringJoiner.join(photos, ","));
}
@Override
public void onError(VKError error) {
showError(error);
}
});
Продолжение