Пишем читалку электронных книг на Android с помощью FBReader SDK
В настоящее время наиболее популярными и удобными способами чтения являются электронные книги. Их можно взять с собой куда угодно, они экономят бумагу, отображение текста в них можно настраивать так, как удобно читателю. По этим причинам появилось множество форматов электронных книг, основные из которых это EPUB, FB2 и MOBI. Всем известные DOC и TXT тоже являются форматами электронных книг, однако их возможности по сравнению с вышеуказанными весьма ограничены. У каждого из форматов есть свои преимущества, однако наиболее часто используемыми являются EPUB и FB2, причём второй популярен только у нас в России.
Одной из особенностей этих форматов является то, что для них нужна специальная программа, которая может работать с конкретным форматом. Поэтому в App Store или Google Play можно найти большое количество разнообразных читалок под все известные форматы. В этой статье мы попробуем написать свою собственную читалку электронных книг. Для этой цели мы воспользуемся специальной SDK от разработчиков FBReader, который доступен по следующей ссылке.
В сентябре этого года FBReader выпустили свой собственный SDK для Android, позволяющий создавать свои собственные читалки на его основе. FBReader SDK обладает большим функционалом, который включает в себя следующие возможности:
- Открытие любых файлов электронных книг (ePub, fb2, mobi, и так далее)
- Чтение метаданных из файла книги
- Особенности движка FBReader
- Возможность менять стиль текста книги
Кроме того, библиотека предоставляет и различные дополнительные возможности для реализации в приложениях, такие как:
- Выделение текста
- Закладки
- Поиск по тексту
- Оглавление
- Дополнительная навигация по тексту
- Поддержка сносок и гиперссылок
- Настройка яркости
Отдельно стоит отметить, что, хоть FBReader SDK и можно скачать с сайта бесплатно, после встраивания в приложение она будет работать в демо-режиме, который имеет полный функционал, но показывает только несколько первых страниц книги. Для того, чтобы получить полную версию библиотеки, нужно купить её на сайте разработчика и, следуя инструкциям, получить специальный ключ SDK, который затем добавляется в приложение.
В этой статье мы рассмотрим, как на основе FBReader SDK создать свою собственную читалку электронных книг и посмотрим её возможности.
Начнём с добавления SDK в свой проект. Для этого создадим новый проект с пустой активностью. В качестве минимального API укажем API 16.
В файле build.gradle модуля проекта добавим в блок allprojects ссылку для скачивания нужных нам библиотек.
Затем в файле build.gradle модуля приложения добавим зависимости с библиотеками в блок dependencies.
Как вы можете заметить, здесь также присутствует библиотека «com.googlecode.json-simple:json-simple:1.1». Она пригодится чуть позже для работы с JSON-файлами.
Библиотек, входящих в FBReader SDK довольно много, однако они разделены так, чтобы можно было подключать только те, которые нужны для конкретного случая.
В этом же файле в блок android добавим следующие строки, которые должны обеспечить успешную сборку проекта.
На сайте SDK разработчики также предоставляют исходный код различных компонентов, которые упрощают реализацию интерфейса. Скачаем его и добавим в проект. Для этого перенесём оттуда папку fbreader в папку своего проекта. После этого в файле settings.gradle пропишем эту папку и пути до нужных модулей.
Теперь добавим зависимости с ними в файле build.gradle модуля приложения.
Когда IDE пересоберёт проект, мы увидим добавленные модули в списке слева.
На этом подключение SDK завершено и можно приступать к непосредственно созданию приложения. В конце статьи у нас должна получиться простая читалка с двумя активностями, одна из которых будет отображать список электронных книг на устройстве, а вторая открывать выбранный файл.
Начнём с разметки. Для MainActivity добавим на экран компонент RecyclerView, который будет содержать собственно список файлов. Для этого добавим в файл layout/activity_main.xml следующий код.
Теперь инициализируем этот объект в коде активности. Откроем файл MainActivity.java и добавим следующий код.
Для того, чтобы работать с файлами, хранящимися на устройстве, нам потребуется запрашивать специальное разрешение. Добавим в манифест приложения AndroidManifest.xml следующие разрешения.
Начиная с API 23 это разрешение необходимо запрашивать у пользователя в рантайме. Для этого при запуске приложения будем проверять версию Android на устройстве и при необходимости отправлять пользователю запрос на получение разрешения.
Получить результат запроса можно, переопределив метод активности onRequestPermissionResult(). Если разрешение приложению было предоставлено, продолжаем дальнейшую работу.
В методе generateList() мы будем искать нужные файлы на устройстве и отображать их в списке приложения. Для этого создадим AsyncTask, который будет выполнять всю работу в отдельном потоке и возвращать готовый список с найденными файлами. Добавим следующий код в MainActivity.
Полученный результат нужно отобразить. Для этого нам понадобится адаптер для RecyclerView и модель, в которой будут храниться данные элементов списка. Создадим простой класс BookFile, в котором мы будем хранить имя файла и путь до него на устройстве.
Теперь нам нужен адаптер, в который мы будем загружать список. Добавим разметку для элемента списка, для этого создадим файл layout/file_list_item.xml и добавим в него следующий код.
Теперь создадим класс BooksAdapter, который будет наследовать от RecyclerView.Adapter<>. В нём нам нужно инициализировать элементы списка, загружая в них пути и имена файлов электронных книг. Таким образом, код адаптера будет выглядеть следующим образом.
Кроме того, между активностью и адаптером пробрасывается интерфейс, с помощью которого мы будем передавать в активность файл, который пользователь хочет открыть.
Вернёмся в главную активность. В методе generateList() мы запускаем AsyncTask и привязываем к нему слушатель, который должен вызывать метод onTaskCompleted() при завершении работы. В этом методе нам нужно составить список, отсортировать его по имени и передать в адаптер. Добавим сюда следующий код:
Теперь, запустив приложение, мы можем увидеть список файлов электронных книг, которые есть на устройстве.
Однако нам нужно этот файл открыть и прочитать, в этом нам и поможет FBReader SDK. Создадим новую активность, назовём её ReaderActivity. Теперь из скачанного исходного кода нам понадобится несколько классов. Откроем в папке с исходным кодом samples/extensions/src/main и скопируем себе в проект целиком папку res, за исключением res/layout/main.xml, и из java/org/fbreader/sample/extensions скопируем все классы, кроме MainActivity.java. Эти классы содержат готовые компоненты, которые помогут нам в создании читалки, при желании их можно модифицировать в соответствии с потребностями.
Теперь откроем layout/reader_activity.xml и добавим в него следующий код разметки.
TextWidgetExt является обёрткой класса библиотеки TextWidget, этот класс является основным и именно он отображает содержимое книги.
Инициализируем теперь эти объекты в коде активности ReaderActivity.java.
Мы должны получить от главной активности путь до файла, который пользователь хочет открыть. Для этого мы будем передавать интент из одной активности в другую, содержащий нужный путь. Вернёмся в MainActivity.java и добавим код создания интента в метод onBookOpen() интерфейса адаптера.
После этого отправленный интент нам нужен получить в ReaderActivity.java при старте активности. Добавим в onCreate() запись пути файла.
Полученный путь мы передаём в метод setBook() у объекта TextWidgetExt. После этого он должен нам вернуть объект Book, который можно получить с помощью метода TextWidgetExt controller(). Если объект не будет равен null, значит загрузка содержимого прошла успешно и можно показать книгу пользователю.
Теперь, если запустить приложение, мы уже можем видеть содержимое книги, пролистывать его и работать с ним.
Однако это не весь функционал, на который способна данная SDK. Ранее мы добавляли файлы ресурсов: различные разметки, иконки и меню. Добавим меню в наше приложение, для этого в ReaderActivity.java переопределим метод onCreateOptionsMenu() и добавим в него следующий код.
Также переопределим методы onPrepareOptionsMenu() и onOptionsItemSelected() для работы с этим меню.
Таким образом мы добавим в читалку меню, позволяющее нам:
- Менять размер текста
- Менять стиль текста
- Искать по тексту
- Открывать оглавление
По поводу оглавления стоит сказать отдельно. В коде, взятом из библиотеки, оглавление представлено в виде отдельной активности, мы её скопировали ранее, но не добавили в манифест. Поэтому откроем файл манифеста AndroidManifest.xml и зарегистрируем в нём новую активность.
Теперь при открытии оглавления через меню у нас будет запускаться новая активность, содержащая в себе оглавление открытой книги. Стоит отметить, что не все книги содержат такое оглавление, поэтому в таких случаях кнопка меню будет неактивна.
При выборе главы обратно в ReaderActivity будет возвращаться номер страницы, на которую нужно перейти. Чтобы получить этот результат, в ReaderActivity.java мы переопределим метод onActivityResult(), в который добавим следующий код.
Как можно увидеть, библиотека предоставляет разработчикам весь свой функционал, единственным ограничением бесплатной версии здесь является то, что она открывает только первые несколько страниц книги, о чём говорится при открытии книги.
Если вы купили ключ SDK и хотите добавить его в своё приложение, вам понадобится в файле build.gradle модуля приложения добавить в блоке buildTypes следующий код.
Не смотря на то, что движок FBReader достаточно мощный, а также учитывая графические ресурсы, добавляемые вместе с библиотекой, итоговый APK получился небольшого размера, что говорит о хорошей оптимизации библиотеки.
Итак, с помощью FBReader SDK и небольшого количества кода мы смогли создать простую читалку для электронных книг. Можно уже оставить как есть, либо продолжить модифицировать, изменяя интерфейс и дизайн так, как нужно разработчику. Пока что SDK есть только на Android, но разработчики планируют к концу года выпустить версию и для iOS.
Пишем читалку электронных книг на Android с помощью FBReader SDK : 4 комментария
В начале написали бы что SDK платная )) причем оочень дорогая ))
Так писали же, что платная.
А есть альтернативы?
SDK не только платная, но еще и очень дорогая. 1000 долларов за лицензию на одно приложение это уж слишком.
Источник
Android в„ў Notes for Professionals book
Androidв„ў Notes for Professionals book
If you found this free Androidв„ў book useful,
then please share it ❤рџЉ
Chapters
- Getting started with Android
- Android Studio
- Instant Run in Android Studio
- TextView
- AutoCompleteTextView
- Autosizing TextViews
- ListView
- Layouts
- ConstraintLayout
- TextInputLayout
- CoordinatorLayout and Behaviors
- TabLayout
- ViewPager
- CardView
- NavigationView
- RecyclerView
- RecyclerView Decorations
- RecyclerView onClickListeners
- RecyclerView and LayoutManagers
- Pagination in RecyclerView
- ImageView
- VideoView
- Optimized VideoView
- WebView
- SearchView
- BottomNavigationView
- Canvas drawing using SurfaceView
- Creating Custom Views
- Getting Calculated View Dimensions
- Adding a FuseView to an Android Project
- Supporting Screens With Different Resolutions, Sizes
- ViewFlipper
- Design Patterns
- Activity
- Activity Recognition
- Split Screen / Multi-Screen Activities
- Material Design
- Resources
- Data Binding Library
- SharedPreferences
- Intent
- Fragments
- Button
- Emulator
- Service
- The Manifest File
- Gradle for Android
- FileIO with Android
- FileProvider
- Storing Files in Internal & External Storage
- Zip file in android
- Unzip File in Android
- Camera and Gallery
- Camera 2 API
- Fingerprint API in android
- Bluetooth and Bluetooth LE API
- Runtime Permissions in API-23 +
- Android Places API
- Android NDK
- DayNight Theme (AppCompat v23.2 / API 14+)
- Glide
- Dialog
- Enhancing Alert Dialogs
- Animated AlertDialog Box
- GreenDAO
- Tools Attributes
- Formatting Strings
- SpannableString
- Notifications
- AlarmManager
- Handler
- BroadcastReceiver
- UI Lifecycle
- HttpURLConnection
- Callback URL
- Snackbar
- Widgets
- Toast
- Create Singleton Class for Toast Message
- Interfaces
- Animators
- Location
- Theme, Style, Attribute
- MediaPlayer
- Android Sound and Media
- MediaSession
- MediaStore
- Multidex and the Dex Method Limit
- Data Synchronization with Sync Adapter
- PorterDuff Mode
- Menu
- Picasso
- RoboGuice
- ACRA
- Parcelable
- Retrofit2
- ButterKnife
- Volley
- Date and Time Pickers
- Localized Date/Time in Android
- Time Utils
- In-app Billing
- FloatingActionButton
- Touch Events
- Handling touch and motion events
- Detect Shake Event in Android
- Hardware Button Events/Intents (PTT, LWP, etc.)
- GreenRobot EventBus
- Otto Event Bus
- Vibration
- ContentProvider
- Dagger 2
- Realm
- Android Versions
- Wi-Fi Connections
- SensorManager
- ProgressBar
- Custom Fonts
- Getting system font names and using the fonts
- Text to Speech(TTS)
- Spinner
- Data Encryption/Decryption
- OkHttp
- Handling Deep Links
- Crash Reporting Tools
- Check Internet Connectivity
- Creating your own libraries for Android applications
- Device Display Metrics
- Building Backwards Compatible Apps
- Loader
- ProGuard — Obfuscating and Shrinking your code
- Typedef Annotations: @IntDef, @StringDef
- Capturing Screenshots
- MVP Architecture
- Orientation Changes
- Xposed
- PackageManager
- Gesture Detection
- Doze Mode
- Colors
- Keyboard
- RenderScript
- Fresco
- Swipe to Refresh
- Creating Splash screen
- IntentService
- Implicit Intents
- Publish to Play Store
- Universal Image Loader
- Image Compression
- 9-Patch Images
- Email Validation
- Bottom Sheets
- EditText
- Speech to Text Conversion
- Installing apps with ADB
- Count Down Timer
- Barcode and QR code reading
- Android PayPal Gateway Integration
- Drawables
- TransitionDrawable
- Vector Drawables
- VectorDrawable and AnimatedVectorDrawable
- Port Mapping using Cling library in Android
- Creating Overlay (always-on-top) Windows
- ExoPlayer
- XMPP register login and chat simple example
- Android Authenticator
- AudioManager
- AudioTrack
- Job Scheduling
- Accounts and AccountManager
- Integrate OpenCV into Android Studio
- MVVM (Architecture)
- ORMLite in android
- Retrofit2 with RxJava
- ShortcutManager
- LruCache
- Jenkins CI setup for Android Projects
- fastlane
- Define step value (increment) for custom RangeSeekBar
- Getting started with OpenGL ES 2.0+
- Check Data Connection
- Java on Android
- Android Java Native Interface (JNI)
- Notification Channel Android O
- Robolectric
- Moshi
- Strict Mode Policy : A tool to catch the bug in the Compile Time.
- Internationalization and localization (I18N and L10N)
- Fast way to setup Retrolambda on an android project.
- How to use SparseArray
- Shared Element Transitions
- Android Things
- Library Dagger 2: Dependency Injection in Applications
- JCodec
- Formatting phone numbers with pattern.
- Paint
- What is ProGuard? What is use in Android?
- Create Android Custom ROMs
- Genymotion for android
- ConstraintSet
- CleverTap
- Publish a library to Maven Repositories
- adb shell
- Ping ICMP
- AIDL
- Android game development
- Android programming with Kotlin
- Android-x86 in VirtualBox
- Leakcanary
- Okio
- Bluetooth Low Energy
- Looper
- Annotation Processor
- SyncAdapter with periodically do sync of data
- Fastjson
- JSON in Android with org.json
- Gson
- Android Architecture Components
- Jackson
- Smartcard
- Security
- How to store passwords securely
- Secure SharedPreferences
- Secure SharedPreferences
- SQLite
- Accessing SQLite databases using the ContentValues class
- Firebase
- Firebase Cloud Messaging
- Firebase Realtime DataBase
- Firebase App Indexing
- Firebase Crash Reporting
- Twitter APIs
- Youtube-API
- Integrate Google Sign In
- Google signin integration on android
- Google Awareness APIs
- Google Maps API v2 for Android
- Google Drive API
- Displaying Google Ads
- AdMob
- Google Play Store
- Sign your Android App for Release
- TensorFlow
- Android Vk Sdk
- Project SDK versions
- Facebook SDK for Android
- Thread
- AsyncTask
- Testing UI with Espresso
- Writing UI tests — Android
- Unit testing in Android with JUnit
- Inter-app UI testing with UIAutomator
- Lint Warnings
- Performance Optimization
- Android Kernel Optimization
- Memory Leaks
- Enhancing Android Performance Using Icon Fonts
- Bitmap Cache
- Loading Bitmaps Effectively
- Exceptions
- Logging and using Logcat
- ADB (Android Debug Bridge)
- Localization with resources in Android
- Convert vietnamese string to english string Android
Example book pages
What people are saying about this Androidв„ў Notes for Professionals book
This is amazing. I just downloaded the Android book, and it’s actually pretty good.
It’s really very awesome books for beginners. Thank you
Great buddy. Helpful for all developers! This book covers almost all topics.
Thank you so much for taking the time to make this, really appreciate it !
Awesome tutorial. Apply many techiniques for Dev Android. Thank you!
One of the best resources about Android programming I’ve ever seen and it’s totally free. Thanks!
The Androidв„ў Notes for Professionals book is compiled from Stack Overflow Documentation, the content is written by the beautiful people at Stack Overflow. Text content is released under Creative Commons BY-SA. See credits at the end of this book whom contributed to the various chapters. Images may be copyright of their respective owners unless otherwise specified
Book created for educational purposes and is not affiliated with Androidв„ў group(s), company(s) nor Stack Overflow. All trademarks belong to their respective company owners
Источник