メディア共有について

面白い画像、情報に富んだ動画、魅力的な音声クリップなど、 ユーザーがコンテンツを共有できるようにすることで、ユーザー エクスペリエンスが充実し、 できます。このドキュメントでは、Android でのメディア共有の基礎について説明します。 (この機能の統合に必要な API と手法を含む)

共有に適した設計

Android の設計では、インテントに基づくシステムを使用して、アプリ間の相互運用性を促進しています。インテントは、実行されるオペレーションの抽象的な記述です。インテントを使用すると、アプリは互いの詳細を知らなくても相互に通信できます。

アプリがデータを共有したりアクションを開始したりする必要がある場合、そのアプリでインテントを作成します。 コンテンツと操作の種類を指定します。Android システムがリストを提示する そのインテントを処理できる関連アプリがすべて含まれ、ユーザーはどのアプリを使用するかを 選択できます。このアプローチにより、協力的なエコシステムが育まれます。

テキストの共有は、わずか数行のコードを記述するだけで済みます。

val sendIntent: Intent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, "This is my text to share.")
    type = "text/plain"
}

val shareIntent = Intent.createChooser(sendIntent, null)
startActivity(shareIntent)

createChooser 行には Android Sharesheet UI が表示されます。これにより、ユーザーは 1 回のタップで、関連するアプリの候補など、他のユーザーと情報を共有できます。Android Sharesheet では他にも次のようなことができます。

Android Sharesheet とその使用方法について詳しくは、他のアプリにシンプルなデータを送信するをご覧ください。

ダイレクト シェアのターゲットを提供すると、他のアプリのユーザーが URL、画像、その他の種類のデータをアプリと簡単にすばやく共有できるようになります。ダイレクト シェアは、ユーザーがアプリを選択して連絡先を検索しなくても、メッセージ アプリやソーシャル アプリの連絡先を Android 共有シートに直接表示します。

OnReceiveContentListener を介してリッチ コンテンツの受信をサポート。この API を使用すると、 書式なしテキストやスタイル付きテキストからマークアップまで、すべてのコンテンツの受信を処理するコードです。 画像、動画、音声ファイルなどです。コンテンツは、画像キーボード、ドラッグ&ドロップ、クリップボードから取得できます。

メディア ファイルを共有する

インテントには少量のデータしか格納できないため、Android ではインテントに ファイルへの安全なハンドルを含むインテント。デバイスから安全にメディア ファイルを アプリには以下が含まれます。

安全に共有する方法について詳しくは、ファイル共有についてをご覧ください。 できます。

共有用にメディアを最適化する

アプリ内の他のユーザーとメディアを共有する場合も、 使用する場合は、高品質の高品質のメディアを 体験を共有できるようになります。

品質とサイズのバランスを取る

サイズの大きなメディア ファイルは、帯域幅とストレージを急速に消費し、遅延やユーザーのデータ超過料金の発生につながる可能性があります。圧縮が強い味方になります。

  • 画像圧縮: WebP や AVIF などの最新の画像圧縮形式を使用します。これらの形式は、画質を大幅に損なうことなく、従来の JPEG よりも優れた圧縮率を実現します。さまざまな品質設定を試して、最適な設定を見つけます。
  • 動画圧縮: AV1 または H.265(HEVC)の動画圧縮を活用して、優れた画質を維持しながら圧縮効率を高めることができます。Android 10 以降のデバイスでハードウェア エンコードの有無を確認したり、mediaPerformanceClass を確認して、デバイスで最適にサポートできるものを判断したりできます。さまざまなユーザーの好みやネットワークの状態に対応できるよう、さまざまな解決策のオプションを提供することを検討してください。
fun hasHardwareEncodingSupportFor(mimeType: String): Boolean {
    val codecList = MediaCodecList(REGULAR_CODECS)
    val codecInfos = codecList.codecInfos
    for ( codecInfo in codecInfos ) {
        if (!codecInfo.isEncoder()) {
            continue;
        }
        if (!codecInfo.isHardwareAccelerated()) {
            continue;
        }
        val types: Array<String> = codecInfo.getSupportedTypes()
        for (j in types.indices) {
            if (types[j].equals(mimeType, ignoreCase = true)) {
                return true
            }
        }
    }
    return false
}
// test for AV1 hardware encoding support
val hasAV1 = hasHardwareEncodingSupportFor("video/av01")

メディアの適応

ソーシャル メディア プラットフォームは多くの場合、特定のサイズやアスペクト比を 共有メディアです。共有する前にメディア ファイルのサイズと切り抜きを事前に調整することで、ユーザーがお気に入りのプラットフォームに投稿する際に、予期しない歪みやフォーマットの問題を回避できます。

メディアを最適化する方法について明確な指示とガイダンスを提供する 確認しましょう。これには、エンコード ビットレートの調整に関するヒントが含まれます。 量子化パラメータの設定、動画形式の選択 適切なファイルサイズを選択したり、さまざまなパフォーマンス 共有オプションを使用します。

メディアの見つけやすさの向上

メディア ファイルにタイトル、説明、タグなどの関連するメタデータを追加すると、検出可能性が向上します。独自のカスタム コンテンツを追加するようユーザーに促す 説明と字幕を共有し、体験をさらにパーソナライズできます。

画像にメタデータを追加する

Jetpack ExifInterface クラスは、EXIF タグの形式でメタデータを JPEG、PNG、WebP 画像に書き込みます。

// sets the title of the image in the form of Exif data
val exif = ExifInterface(imageFile)
exif.setAttribute(ExifInterface.TAG_IMAGE_DESCRIPTION, "Beautiful sunset")
exif.saveAttributes()