Telegram으로 스티커를 가져오기 위한 Flutter 플러그인

텔레그램은 최근 new contest 을 발표했습니다.

주어진: Android 및 iOS 앱용 스티커 가져오기 메커니즘.

작업: 이 메커니즘을 사용하는 Android 또는 iOS 앱을 작성합니다.

기간은 매우 제한적이며 마감일은 7월 4일입니다. 객관적으로 이렇게 짧은 시간에 앱을 작성할 시간이 없습니다. 저는 이 콘테스트에서 Flutter 개발자를 돕고 기본 SDK와 함께 작동하는 플러그인을 작성하기로 결정했습니다. 이 기사는 그것에 대해 설명합니다.

Telegram이 어떤 종류의 가져오기 메커니즘을 제공하는지 봅시다.

기계적 인조 인간



공식 저장소는 here 입니다. 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/*");


어려움은 타사 응용 프로그램이 모든 파일에 액세스할 수 있도록 권한을 부여해야 한다는 것입니다(원시 디렉터리의 경우는 고려하지 않음). 응용 프로그램 간의 파일 공유에 대한 자세한 내용은 official documentation 에서 확인할 수 있습니다.

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 파일을 추가합니다.

<?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



공식 저장소는 here 입니다. Telegram은 iOS용 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);
    }
    


    결론



    Telegram이 iOS 전용 SDK를 만든 것이 이상하고 Android 개발자는 항상 그렇듯이 레인 댄스를 해야 합니다.

    my plugin 을 이용하시면 기쁠 것입니다.

    풀 리퀘스트를 기다리고 있습니다.

    챠오!

    좋은 웹페이지 즐겨찾기