вторник, 5 марта 2013 г.

Как добавлял поддержку GDrive в android проект

Была уже поддержка dropbox, box.com. Настала очередь и google drive. Как никак продукт от самого гугла, а они умеют продвигать, что им надо. Правда потом так же успешно закрывать. Но не об это сейчас.

Все эти ребята как любят делать. Генеришь определенный урлик с app_id и открываешь в браузере, вводишь свои данные, а на выходе тебе токен. Хорошо, конечно, но хотелось бы лучше, когда просто открывается активити, юзер вводит логин, пароль, кликает "логин", в фоне логиниться и продолжает работать. Фактически надо повторить определенную последовательность GET/POST запросов и дело в шляпе. Так было с обоими первыми хранилищами (да и с facebook тоже).

С гуглом такое не прошло. Они юзают js, а через обычный явовский http клиент такое не с имитировать. Есть конечно, htmlunit и selenium, которые позволяют заюзать, вроде бы, без gui-шный браузер. Но сам не проверял, да и весят прилично. На данный момент отказался.
Можно было пойти законным путем для андроида. Но, честно не хотелось тянуть их либы, которые постоянно обновляются, потом какие-то api помечаются как устаревшие. Ведь фактически gdrive вышел из google docs. Тем более, что мне не так и много надо было операций (dir, upload, download, create folder, delete file/folder). Вполне можно было обойтись обычными GET/POST/DELETE запросами с передачей токенов.

Как ни странно, столкнулся с проблемой. Токен получался из аккаунта гугла, что подключен на девайсе, но он не был привязан к app_id. Пример гугловский оказался не рабочий, там так же вываливалась ошибка о не настроенном доступе (впрочем так часто бывает с примерами, гугл здесь оказался не исключением). Поиск на stackoverflow показал, что дело всё-таки в бабине. Плюс нашелся на github рабочий вариант.

Но как-то уже расхотелось юзать андроидовский вариант. Тем более нужны были тесты на яве. В итоге авторизацию стал делать как для stand alone application. Кратко: открываете в браузере определенный урлик, логинитесь, в ответ получить в теле html некоторый код, потом POST-запрос с этим кодом, в ответ же долгожданный accessToken и refreshToken. Токен живет 10 минут, потом его надо обновлять. Интересно, что после обновления приходит только accessToken, refreshToken остается прежним ( в том же box.com и refreshToken приходит новый). В моём выборе я был не одинок. Expert Explorer и ES Explorer использовали такой же механизм.
Ну а дальше уже юзал простые api.

Единственным нюансом оказалось удаление файлов/папок. Сперва использовал вариант через /files. Но был какой-то полукривой. Вроде объект удаляется, повторный вызов апи показывает, что объекта уже нет, а на вебе висит, хотя с ним ничего сделать нельзя. Через некоторое время он пропал и в вебе, но осадок остался. Второй вариант /children уже не доставил никаких неудобств.

В общем не без затыков, но задача была решена. Как часто бывает, спасибо докам гугла, достаточно информативно и понятно, плюс "Try it!" тоже хорошая вещь для отладки, посмотреть, какой там json генерится.