Android и ВКонтакте, часть 1 (авторизация и получение прав)

Начал я разрабатывать под платформу Android не так давно, поэтому приходилось очень много гуглить в поисках какого либо решения для различных задач. В итоге материала много, но он разбросан по разным источникам и почти везде описания совсем нет. В своей статья я постараюсь максимально подробно описать те проблемы, с которыми я сталкнулся в ходе изучения языка и решения опредёленных задач.

Наша задача, научиться постить на стену вконтакте, используя Api функцию wall.post, фотографии сделанные с камеры телефона или прямо из галереи. Поэтому начнём пожалуй с самого важного, это авторизация через вконтакте и получение token'на.

Используя поиск google.com можно быстро и легко найти пост на хабре, в котором описано подключение библиотеки проекта "Kate Mobile". Сейчас там реализованы основные функции для работы с Api VKontakte, но часть из них пришлось дописывать для нашей конкретной задачи. Об этом немного позже.

SDK опубликовано на гитхабе https://github.com/thest1/Android-VKontakte-SDK. Распространяется по лицензии MIT. Вы можете её использовать в любых проектах, в том числе коммерческих. Можете её модифицировать.

Быстро понять принципы работы библиотеки вам поможет демо-проект AndroidVkSdkSample. В нём реализована авторизация и, в качестве примера, отправка записи на свою стену.

И так приступим:

  1. Импортируем проект AndroidVkSdk в свою IDE (лично я использую IntelliJ IDEA от JetBrains, мне как то больше подуше продукты этой компании). Я просто взял и скопировал папку src/* и res/* в свой проект.
  2. Добавляем в файл AndroidManifest.xml запрос прав на доступ в интернет:
    <uses-permission android:name="android.permission.INTERNET"/>
  3. Объявляем переменные в классе MainActivyty:
    private final int REQUEST_LOGIN = 1;
    private static final int REQUEST_CAMERA = 2;
    private static final int REQUEST_SELECT_PHOTO = 3;
    Account account = new Account();
    Api api;
  4. Делаем запрос авторизации сразу при загрузке приложения, для этого в функции onCreate класса MainActivity пропишем строки: 
    //Восстановление сохранённой сессии
    account.restore(this);
    
    //Если сессия есть создаём API для обращения к серверу
    if( account.access_token != null ) {
        api = new Api(account.access_token, Constants.APP_ID);
        //Данные юзера есть, можно постить на стену
        api.createWallPost(user_id, text, null, null, false, false, false, null, null);
    } else {
        Intent intent = new Intent();
        intent.setClass(this, LoginActivity.class);
        startActivityForResult(intent, REQUEST_LOGIN);
    }
  5. Добавляем функцию onActivityResult для получения ответа об успешной авторизации из LoginActivity:
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        switch( requestCode ) {
            //Получили авторизацию от контакта
            case REQUEST_LOGIN:
                if( resultCode == RESULT_OK ) {
                    //авторизовались успешно
                    account.access_token = data.getStringExtra("token");
                    account.user_id = data.getLongExtra("user_id", 0);
                    account.save(StartActivity.this);
                    api = new Api(account.access_token, Constants.API_ID);
                }
            break;
        }
    }
  6. Для того, чтобы приложение постоянно не спрашивало логин и пароль от контакта, а незаметно получала права, закомитим следующие строчки в файле LoginActivity.java:
    //CookieSyncManager.createInstance(this);
    //
    //CookieManager cookieManager = CookieManager.getInstance();
    //cookieManager.removeAllCookie();

В итоге, мы научились получать авторизацию из VK со всеми необходимыми правами для работы нашего приложения. Удачи вам в ваших начинаниях.

UPD:

Данный пост можно считать морально устаревшим, более новый с использованием VK SDK описан в статье Android и VKontakte SDK.

P.Nixx, 18.09.2012, 17:11