面白い画像、情報に富んだ動画、魅力的な音声クリップなど、 ユーザーがコンテンツを共有できるということは、ユーザー エクスペリエンスが充実し、 できます。このドキュメントでは、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 の共有シートでは、次のようなこともできます。
Android Sharesheet とその使用方法について詳しくは、他のアプリにシンプルなデータを送信するをご覧ください。
直接共有ターゲットを指定して、 他のアプリから、URL や画像などのデータをアプリと共有します。ノーリファラー 共有機能では、メッセージやソーシャル アプリの連絡先が直接表示されます できます。ユーザーはアプリを選択してから、 連絡先を検索します。
リッチ コンテンツの受信を
OnReceiveContentListener
。この API を使用すると、
書式なしテキストやスタイル付きテキストからマークアップまで、すべてのコンテンツの受信を処理するコードです。
画像、動画、音声ファイルなどです。コンテンツは画像から抽出できます。
キーボード、ドラッグ&ドロップ、クリップボードから操作できます。
メディア ファイルを共有する
インテントには少量のデータしか格納できないため、Android ではインテントに ファイルへの安全なハンドルを含むインテント。アプリからメディア ファイルを安全に共有するには、次の操作を行います。
- ファイルへの安全なハンドルを提供するようにアプリを構成する -
コンテンツ URI - Android
FileProvider
コンポーネントを使用します。 - マニフェストで共有可能なディレクトリを指定します。
getUriForFile
を使用して、保護された URL として機能するコンテンツ URL を作成します。 指定します。- ファイルへの権限を付与するインテントを作成します。
ファイルを安全に共有する方法については、ファイルの共有についてをご覧ください。
共有用にメディアを最適化する
アプリ内の他のユーザーとメディアを共有する場合でも、別のアプリとメディアを共有する場合でも、高品質な共有エクスペリエンスを提供するメディアを共有する必要があります。
品質とサイズのバランスをとる
サイズの大きいメディア ファイルでは、帯域幅とストレージがあっという間に消費されるため、 遅延や、データ超過料金のご請求が発生いたします。 圧縮が強い味方になります。
- 画像圧縮: 次のような最新の画像圧縮形式を利用します。 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 クラスは、メタデータを JPEG、PNG、WebP に書き込みます。 Exif タグの形式で作成します
// 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()