Application to collect data on your reading habits. Which books you read. When you read. How much you read. So you could analyze this data for yourself.
- In the begging there was a phrase "The Amazon Kindle reports which pages of which books the user looks at, and when"...but I want this information too, for e-books I read
- TODO:continue
using Android Accessibility APIs
TODO: technical description
- readings are sent to server app at https://parse.com/
- CloudCode functions used to send e-mails when you switch away from book,etc
-
Checked on:
-
HP Slate 21 (not "Pro") with Android 4.4
-
Sony Xperia Tablet Z2 (stock firmware) with с Android 4.4
-
Sony Xperia Z Ultra with CyanogenMod
-
Nexus 5/7/10...with CyanogenMod or with stock
-
I used slightly different method for Android 4.2 because Accessibility API works in slightly different way here (Target Android version would be 4.3 if not for my HP Slate 21)
-
4.2 is no longer supported, sources of last version with 4.2 support is at https://github.com/intari/readingtracker/tree/Last_API_17_Android_4_2
- For now only GPLv3 https://www.gnu.org/licenses/gpl-3.0.html
- I also reserve right to re-license my code under any other license for any purpose I want.
- Included ParseUI-Android library is (of course) licensed under it's own license. Same applies to Hockeyapp's binaries and other 3rd-party libraries
- Only Mantano Reader Premium currently supported (it's great app! Why you need anything else?)
I plan to add client side graphs,reporting,etc at some point in future Server side part currently send e-mails with reading details when you done reading.
If you build your own version, privacy policy is up to you of course. If you use my build it's simple: I will only sell/transfer data if asked by relevant authority. When this app will be on Play Store / Amazon App Store I will write something more formal.
Not yet. But will be
- HockeyApp - updates for test builds
- Parse - data store, server-side logic, analytics, crash handling
- Mandrill - sending reading progress notifcations
Code will not build correctly without them.
- if don't do this, your build WILL fail
- cd $HOME
- mkdir .androidSigning/
- touch booktrackerAPIKeys
- edit booktrackerAPIKeys to add:
- PARSE_APP_ID=your_parse_app_id (https://parse.com/ , Application used Parse as network backend
- PARSE_CLIENT_KEY=your_parse_client_key
- PARSE_MASTER_KEY=master_key_for your_parse_application (used for crash reporting)
- HOCKEYAPP_APP_ID=your_HockeApp_app_id (used to check for updates if they are distributed via HockeyApp)
- HOCKEYAPP_TOKEN=your_HockeyApp_token (for this app, used to automatically upload updated version here)
- PARSE_APP_ID_FOR_TEST_HARNESS=not currently used but something must be put here
- PARSE_CLIENT_KEY_FOR_TEST_HARNESS=not currently used but something must be put here
- PARSE_USERNAME_FOR_TEST_HARNESS=not currently used but something must be put here
- PARSE_PASSWORD_FOR_TEST_HARNESS=not currently used but something must be put here
- COUNTLY_SERVER = count.ly analytics server URL
- COUNTLY_APPKEY = count.ly analytics App Key
- TODO:describe others you can change paths in gradle.properties
- or look at build.gradle to determine how to use env vars
if you Espresso tests and your device is not configured to disable animations manually you should uncomment lines around 'grantAnimationPermission' in build.gradle. See This Gist for example. See Disabling Animations to knew why this is needed
currently getVersionCodeFromNetwork() from build.gradle doesn't work on Windows Simple solution is just put 'return 0' instead of it's content.
Maybe later
Permissions
- RECEIVE_BOOT_COMPLETED - to be able to catch moments when you start read
- INTERNET - communication with our server
- ACCESS_NETWORK_STATE - usage analytics & error reportings
- READ_PHONE_STATE - statistics
- GET_TASKS - to knew when you switch from supported reading app to something other
- WRITE_EXTERNAL_STORAGE -
- BIND_ACCESSIBILITY_SERVICE - main app functionality. you will be asked to provide access to 'Accessibility Services' on startup. You could refuse but you will not be able to get your statistics from this device
- Freepik from FlatIcon. Icon(s) are based on
#Russian
Приложение для сборка данных о том как вы читаете. Какие книги. Когда. Сколько. Для того чтобы вы могли сами проанализировать эти данные
- В начале была фраза "Amazon Kindle докладывает, в какие страницы каких книг заглядывает пользователь и когда он это делает"...но мне захотелось тоже иметь эту информацию. Для тех книг что я читаю.
- TODO:дальше
-
С использованием API Специальных Возможностей (Accessibility API) Android'а отслеживается структура элементов управления и читается часть текста с них. За счет этого отслеживается находимся ли мы в Библиотеке или в конкретной книге. И где именно в книге мы находимся.
-
Затем все отсылается в мое приложение на Parse Platform
-
на сервере при приеме данных запускаются функции CloudCode которые выполняют дополнительную обработку (отсылку e-mail когда пользователь переключился с книги например)
Нет. Разумеется когда читалка не активна, никакого отслеживания не выполняется.
- Android 4.3+ ** ранее поддерживался и 4.2, исходники последнией версии с поддержкой 4.2 - https://github.com/intari/readingtracker/tree/Last_API_17_Android_4_2
- поддерживаемая читалка
- разрешение приложению доступа в 'Специальных возможностях'
- Проверено на:
- HP Slate 21 (не "Pro") c Android 4.4
- Sony Xperia Tablet Z2 с родной оболочкой с Android 4.4
- Sony Xperia Z Ultra с CyanogenMod
- Nexus 5/7/10...как с CyanogenMod так и без
- Собираемость текущей версии и прохождение автотестов (знаю что тестируется далеко не все...пока что):
, вы можете посмотреть как оно собирается на https://travis-ci.org/intari/readingtracker
- для Android 4.2 используется чуть другой метод работы из-за отличающегося поведения API Специальных Возможностей. Вообще если бы не тот HP Slate 21 где Kitktat вышел 29 декабря 2014 то минимальной версией был бы 4.3. Поддержку других читалок тоже будет обеспечить проще.
GPLv3 https://www.gnu.org/licenses/gpl-3.0.html Я оставляю за собой право изменить лицензию на любую другую когда это будет необходимым. ParseUI-Android разумеется под своей собственной лицензий. Как и бинарные библиотеки Parse Platform / HockeyApp и остальные сторонние
- Пока только Mantano Reader (Lite & Essentials редакции тоже должны работать но тестирования было очень мало) . А зачем вам что-то еще?
Красивые картинки со статистикой будут позднее. Пока серверная часть только посылает e-mail'ы и дописывает в заметку Evernote
Если вы сами соберете сборку, то это уже к вам вопрос Для Google Play Store версии скоро будет
- Разумеется - Google Play Store
- HockeyApp - для обновлений тестовых версий
- Parse - хранилище данных, серверная логика, аналитика, сборка данных о крешах
- Mandrill - рассылка нотификацией о процессе чтения
- Flurry - аналитика (видимо буду убирать)
- Countly - аналитика (пока используется бесплатная версия Countly Cloud)
Приложение просто не соберется. Так намеренно сделано. Получите свои и укажите. Ну или подправьте build.gradle
-
cd $HOME
-
mkdir .androidSigning/
-
touch booktrackerAPIKeys
-
в booktrackerAPIKeys добавьте:
- PARSE_APP_ID=your_parse_app_id (https://parse.com/ , Application used Parse as network backend
- PARSE_CLIENT_KEY=your_parse_client_key
- PARSE_MASTER_KEY=master_key_for your_parse_application (used for crash reporting)
- HOCKEYAPP_APP_ID=идентификатор приложения для HockeApp (используется для проверки апдейтов)
- HOCKEYAPP_TOKEN=токен_HockeyApp_для данного приложения (используется для загрузки новой версии)
- PARSE_APP_ID_FOR_TEST_HARNESS=пока не используется но указать что-то надо
- PARSE_CLIENT_KEY_FOR_TEST_HARNESS=пока не используется но указать что-то надо
- PARSE_USERNAME_FOR_TEST_HARNESS=пока не используется но указать что-то надо
- PARSE_PASSWORD_FOR_TEST_HARNESS=пока не используется но указать что-то надо
- COUNTLY_SERVER = count.ly analytics server URL
- COUNTLY_APPKEY = count.ly analytics App Key
- TODO:остально (про систему работы с versionCode) пути можно помять в gradle.properties
-
или посмотрите в build.gradle как задать это же с использованием переменных окружения
Может быть
- RECEIVE_BOOT_COMPLETED - запуск мониторинга с момента загрузки
- INTERNET - общение с серверной частью
- ACCESS_NETWORK_STATE - анатилитка и отсылка ошибок
- READ_PHONE_STATE - статистика
- GET_TASKS - отслеживание ситуации когда вы переключаетесь с поддерживаемой читалки на что-то е-е
- WRITE_EXTERNAL_STORAGE - хранить временные данны
- BIND_ACCESSIBILITY_SERVICE - для работы основного функционала приложения (приложения попросит при запуске разрешить доступ к 'Специальным возможностям', вы можете отказаться но сбор аналитики по книгам работать не будет)
- WAKE_LOCK / VIBRATE / GET_ACCOUNTS - для работы пуш-нотификаций
- Q:Приложение спрашивает доступ к Специальным возможностям хотя уже выдано. A:Вы видимо недавно обновили приложение. Перезагрузите устройство либо отключите доступ и тут же включите
В отчетах есть: перелистывания (pageSwitches), начальные/конечные/прочитанные/текущие номера страниц.
это когда чтение закончено на более ранеей позиции чем начато (может это справочник какой то)
то что считает таковым поддерживаемый ридер. в случае Mantano Reader это так называеме ADE Pages (придуманные Adobe для Adobe Digital Editions)
- они специфичны для книги
- они могут соответствовать печатной книге а могут и не соответсвовать
- автор EPUB-файла может явно указать какие места каким страницам соответствуют - смотри https://blog.safaribooksonline.com/2009/11/26/adobe-page-map-versus-ncx-pagelist/
- если автор не указал - используется 'стандартное' разбиение (1024 символа на страницу насколько я помню)
- ADE Pages не зависят от разрешения экрана. ** Что кстати означает что если у нас Landscape-ориентация и включен двух-страничный режим то совершенно запросто одной 'странице' экранной могут соответствовать две или боле ADE Pages ** На некоторых мелких экранах может быть наоборот
- то что делает Calibre для подсчета страниц - это приближение
все упомянания 'страниц' в приложении - это как раз поддерживаемые ридером страницы. отсюда и проблемы с тем что могут быть скачки 'через страницу'
это просто - смена пользователем текущей страницы (нажатие на стрелочки)
- Freepik from FlatIcon. Icon(s) are based on