Flutter плагин для импорта стикеров в телеграм

от автора

Недавно Telegram анонсировал новый конкурс:

Сообщение от https://t.me/ContestBot
Сообщение от https://t.me/ContestBot

Дано: механизм импорта стикеров для Android и iOS приложений.

Задача: написать Android или iOS приложение, использующее этот механизм.

Сроки очень ограничены, дедлайн 4‑го июля. Объективно, написать приложение за столь короткий я не успеваю. Решил хотя бы помочь Flutter разработчикам в этом конкурсе и написать плагин для работы с нативными SDK. Об этом и будет статья.

Для начала разберемся что за механизм импорта предлагает нам Telegram?

Android

Официальный репозиторий находится тут. Никакого SDK нет. Для импорта стикеров нужно просто отправить Intent с набором параметров. Что может быть проще?

Intent intent = new Intent(CREATE_STICKER_PACK_ACTION); intent.putExtra(Intent.EXTRA_STREAM, stickers); intent.putExtra(CREATE_STICKER_PACK_IMPORTER_EXTRA, getPackageName()); intent.putExtra(CREATE_STICKER_PACK_EMOJIS_EXTRA, emojis); intent.setType("image/*");

Сложность заключается в том, что для того чтобы стороннее приложение имело доступ к какому-либо вашему файлу нужно это разрешение выдать (не рассматриваем случай raw директории). Подробнее об обмене файлами между приложениями можно почитать в официальной документации.

Чтобы организовать доступ к вашим файлам следует использовать FileProvider. По сути, мы описываем к каким директориям хотим предоставить доступ, а также имя, которое спрячет настоящий путь до файлов.

Для простоты я прописал одну папку в директории с кешом. В случае, если вы захотите использовать какую-то другую свою папку, вам будет необходимо настроить манифест:

... <provider     android:name="androidx.core.content.FileProvider"     android:authorities="${applicationId}.provider"     android:exported="false"     android:grantUriPermissions="true">     <meta-data         android:name="android.support.FILE_PROVIDER_PATHS"         android:resource="@xml/filepaths" /> </provider> ...

и добавить xml файл c описанием доступных путей:

<?xml version="1.0" encoding="utf-8"?> <paths>     <cache-path path="telegram_stickers_import/" name="telegram_stickers_import" /> </paths>

При таком использовании путь:

/data/user/0/com.otopba.telegram_stickers_import_example/cache/telegram_stickers_import/sticker1.webp

Превращается в:

content://com.otopba.telegram_stickers_import_example.provider/telegram_stickers_import/sticker1.webp

iOS

Официальный репозиторий находится тут. Для iOS Telegram предоставляет SDK и даже сделал валидацию данных с человеческими ошибками.

Для работы вам нужно добавить несколько строчек в Info.plist:

<key>LSApplicationQueriesSchemes</key> <array> <string>tg</string> </array>

Как использовать плагин

Как и ожидалось, плагин получился максимально простым: один метод, в который нужно передать ваш стикерсет для импорта:

class TelegramStickersImport {   /// Folder inside cache directory for store your stickers   static const androidImportFolderName = "telegram_stickers_import";    static const MethodChannel _channel = MethodChannel(     'telegram_stickers_import',   );      /// Method for import sticker set   static Future<String?> import(StickerSet stickerSet) async {     return _channel.invokeMethod('import', stickerSet.toMap());   } }

Нюанс заключается в чтении файлов стикеров:

  • для работы Android приложения вам понадобится копировать файлы ваших стикеров в папку cache/telegram_stickers_import (или ту, что вы настроите себе сами);

  • для работы iOS приложения вам нужно будет считывать содержимое стикеров в Uint8List

StickerData({this.path, this.bytes});  /// Android factory factory StickerData.android(String path) {   return StickerData(path: path); } /// iOS factory factory StickerData.iOS(Uint8List bytes) {   return StickerData(bytes: bytes); }

Заключение

Странно конечно, что телеграм сделал SDK только для iOS, а Android разработчикам как всегда достаются танцы с бубном.

Буду рад если вы воспользуетесь плагином.

Жду пул реквестов

Чао!

ссылка на оригинал статьи https://habr.com/ru/post/565152/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *