Android では、インテントとそれに関連するエクストラを使用して、ユーザーが情報をすばやく共有できるようにしています。 簡単に利用できます。
Android では、ユーザーがアプリ間でデータを共有するのに、2 つの方法があります。
- Android Sharesheet は主に、コンテンツをアプリ外に送信したり、コンテンツを直接送信したりするために設計されています 選択します。たとえば、友人との URL の共有などです。
- Android のインテント リゾルバは、 明確に定義されたタスクの次のステージに移ります。たとえば、アプリから PDF を開き、ユーザーに 視聴者を選ぶことができます
インテントを作成するときに、インテントに実行させるアクションを指定します。
Android はアクション ACTION_SEND
を使用します。
あるアクティビティから別のアクティビティにデータを送信する
プロセス境界を越えて可視化できます。次を指定する必要があります。
型を指定します。対応するアクティビティが自動的に識別される
(データを受信してユーザーに表示できる)が存在します。インテントリゾルバの場合
インテントを処理できるアクティビティが 1 つだけの場合、そのアクティビティが直ちに開始されます。
Android Sharesheet を使用する理由
Android Sharesheet を使用して、ユーザー間での一貫性を保つことを強くおすすめします。 。アプリ独自の共有ターゲット リストを表示したり、独自の共有ターゲット リストを作成したりしない 共有シートのバリエーション。
Android Sharesheet を使用すると、他のユーザーと情報を共有できます。 適切な人物に適切なおすすめのアプリを提示できます。 Sharesheet は、カスタム ソリューションでは利用できないターゲットを提案でき、一貫したランキングを使用します。 これは、Sharesheet がアプリとユーザーのアクティビティに関する情報を考慮できるためです。 システムでのみ利用可能な リソースがあります
また、Android Sharesheet には、デベロッパーにとって便利な機能が多数あります。たとえば 次の操作を行います。
- ユーザーがいつ共有を完了し、どこと共有したかを知る
- カスタム
ChooserTarget
とアプリ ターゲットを追加する - リッチテキスト コンテンツのプレビューを提供する(Android 10(API レベル 29)以降)
- 特定のコンポーネント名に一致するターゲットを除外する
Android Sharesheet を使用する
すべての種類の共有について、インテントを作成し、そのアクションを
Intent.ACTION_SEND
。
Android Sharesheet を表示するには、次の呼び出しを呼び出します。
Intent.createChooser()
,
Intent
オブジェクトを渡します。
Android Sharesheet を常に表示するバージョンのインテントが返されます。
テキスト コンテンツを送信する
Android Sharesheet の最も簡単で一般的な用途は、テキスト コンテンツを 関連付けられます。たとえば、ほとんどのブラウザでは、現在表示されている URL の URL を ページをテキストとして表示できますこの機能は、 メールやソーシャル ネットワーキングなど、以下はその方法の例です。
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) startActivity(shareIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); Intent shareIntent = Intent.createChooser(sendIntent, null); startActivity(shareIntent);
必要に応じて追加情報を追加し、メール受信者などの詳細情報を追加できます。
(EXTRA_EMAIL
、
EXTRA_CC
,
EXTRA_BCC
)、
メールの件名
(EXTRA_SUBJECT
)など
注: Gmail などの一部のメールアプリでは、
String[]
: その他の特典
EXTRA_EMAIL
、EXTRA_CC
。使用
putExtra(String, String[])
これらをインテントに追加します。
バイナリ コンテンツを送信する
ACTION_SEND
アクションを使用してバイナリデータを共有します。
適切な MIME タイプを設定し、エクストラ
EXTRA_STREAM
、
表示されます。
これは、画像の共有によく使用されますが、あらゆる種類のバイナリ コンテンツの共有にも使用できます。
Kotlin
val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... putExtra(Intent.EXTRA_STREAM, uriToImage) type = "image/jpeg" } startActivity(Intent.createChooser(shareIntent, null))
Java
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); // Example: content://com.google.android.apps.photos.contentprovider/... shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, null));
受信側アプリには、Uri
のデータにアクセスする権限が必要です。
参照します。推奨される方法は次の 2 つです。
- データは独自の
ContentProvider
に保存し、 アプリにプロバイダにアクセスするための適切な権限が付与されている。コンピューティング モデルに URI ごとの権限を使用する方法があります。URI ごとの権限は、 受信側アプリケーションにのみアクセスを許可することです。簡単にContentProvider
は、FileProvider
ヘルパークラス。 - システム
MediaStore
を使用します。MediaStore
は主に、動画、音声、画像の MIME タイプ用です。ただし、Android 3.0(API レベル 11)の場合、メディア以外のタイプも保存できます。詳細については、次をご覧ください:MediaStore.Files
。 ファイルは、次のコマンドを使用してMediaStore
に挿入できます。scanFile()
, その後、content://
スタイルのUri
指定したユーザー グループにonScanCompleted()
呼び出すことができます。システムMediaStore
に追加されると、コンテンツには できます。
正しい MIME タイプを使用する
取得できるデータで利用可能な MIME タイプのうち最も具体的なものを指定してください
あります。たとえば、書式なしテキストを共有する場合は text/plain
を使用します。たとえば
一般的な MIME タイプは次のとおりです。
受取人は | 送信者が送信 |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
サポートされているファイル拡張子 | application/pdf |
MIME タイプの詳細については、 IANA MIME メディアタイプの公式レジストリです
Android Sharesheet は、指定された MIME タイプに応じてコンテンツ プレビューを表示する場合があります。一部 プレビュー機能は特定のタイプでのみ使用できます。
複数のコンテンツを共有する
複数のコンテンツを共有するには、ACTION_SEND_MULTIPLE
を使用します。
そのコンテンツを指す URI のリストを渡しています。MIME タイプは、ファイルの種類によって
コンテンツの混在環境を考慮する必要があります。たとえば、3 つの JPEG 画像を共有する場合は、
"image/jpg"
。複数の画像タイプが混在している場合は、"image/*"
を使用して
任意のタイプの画像を処理するアクティビティです。複数のタイプを混在させて共有することもできますが、
おすすめできません。これは、
何を送信するのかが受信者にわかりません。複数のタイプを送信する必要がある場合は、
"*/*"
。受信側のアプリケーションが
データを処理します次の例をご覧ください。
Kotlin
val imageUris: ArrayList<Uri> = arrayListOf( // Add your image URIs here imageUri1, imageUri2 ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } startActivity(Intent.createChooser(shareIntent, null))
Java
ArrayList<Uri> imageUris = new ArrayList<Uri>(); imageUris.add(imageUri1); // Add your image URIs here imageUris.add(imageUri2); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); shareIntent.setType("image/*"); startActivity(Intent.createChooser(shareIntent, null));
指定された Uri
オブジェクトが
アクセスできるデータを制限することです。
テキスト プレビューにリッチ コンテンツを追加する
Android 10(API レベル 29)以降では、Android Sharesheet にテキストのプレビューが表示されます。
あります。場合によっては、共有されているテキストが理解しにくいことがあります。共有することを検討する
https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
のような複雑な URL です。より豊かに
プレビューすることで、ユーザーは共有される内容について安心感を与えることができます。
テキストをプレビューする場合は、タイトルまたはサムネイル画像、あるいはその両方を設定できます。説明を追加
Intent.createChooser()
を呼び出す前に Intent.EXTRA_TITLE
を実行し、
ClipData
を使用して関連するサムネイルを作成します。
注: 画像コンテンツの URI は、
FileProvider
(通常は構成された <cache-path>
から取得)。
詳細については、ファイルの共有をご覧ください。必ず
サムネイルとして使用したい画像を読み取るための適切な権限を Sharesheet に共有します。詳しくは
Intent.FLAG_GRANT_READ_URI_PERMISSION
をご覧ください。
次の例をご覧ください。
Kotlin
val share = Intent.createChooser(Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/") // (Optional) Here you're setting the title of the content putExtra(Intent.EXTRA_TITLE, "Introducing content previews") // (Optional) Here you're passing a content URI to an image to be displayed data = contentUri flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null) startActivity(share)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/"); // (Optional) Here you're setting the title of the content sendIntent.putExtra(Intent.EXTRA_TITLE, "Introducing content previews"); // (Optional) Here you're passing a content URI to an image to be displayed sendIntent.setData(contentUri); sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Show the Sharesheet startActivity(Intent.createChooser(sendIntent, null));
プレビューは次のようになります。
Sharesheet にカスタム アクションを追加する
Android 14(API レベル 34)以降では、アプリは Android Sharesheet にカスタム アクションを追加できます。
カスタム アクションは、Android Sharesheet とアプリの上部に小さなアクション アイコンとして表示されます。
アイコンがクリックされたときに呼び出されるアクションとして任意の Intent
を指定できます。
Android Sharesheet にカスタム アクションを追加するには、まず
ChooserAction
ChooserAction.Builder
。
アイコンがクリックされたときに呼び出されるアクションとして PendingIntent
を指定できます。作成
すべてのカスタム操作を含む配列を作成し、
EXTRA_CHOOSER_CUSTOM_ACTIONS
(シェア Intent
)
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
カスタム ターゲットを追加する
Android Sharesheet では、共有する ChooserTarget
オブジェクトを最大 2 つ指定できます。
ChooserTargetServices
から読み込まれた共有ショートカットと選択ツール ターゲットの前に表示されます。また、
リストされているアクティビティを指すインテントを最大 2 つ指定します
プロンプトを表示します。
Intent.EXTRA_CHOOSER_TARGETS
と Intent.EXTRA_INITIAL_INTENTS
を追加
呼び出し後の共有インテント
Intent.createChooser()
:
Kotlin
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
Java
Intent shareIntent = Intent.createChooser(sendIntent, null); share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray); share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);
この機能の使用には注意が必要です。カスタムのIntent
ごと
ChooserTarget
を追加すると、システムが提案する候補の数が少なくなります。一般的に、
カスタム ターゲットの追加はおすすめしません。一般的な適切な
Intent.EXTRA_INITIAL_INTENTS
は、共有ファイルでユーザーが行える追加の操作を提供するためのものです
説明します。たとえば、ユーザーが画像を共有し、Intent.EXTRA_INITIAL_INTENTS
を使用して以下を行います。
代わりにリンクを送信してもらいますIntent.EXTRA_CHOOSER_TARGETS
を追加する一般的な適切な例
アプリが提供する関連性の高いユーザーやデバイスを表示することです。
コンポーネントごとに特定のターゲットを除外する
特定のターゲットを除外するには、Intent.EXTRA_EXCLUDE_COMPONENTS
を指定します。
この操作は、自身が管理するターゲットを削除する場合にのみ行ってください。一般的なユースケースとして、
ユーザーがアプリ内から共有する場合、アプリの共有の意図は共有されやすいため、アプリの共有ターゲット
使用できます。
Intent.createChooser()
を呼び出した後、インテントに Intent.EXTRA_EXCLUDE_COMPONENTS
を追加します。
Kotlin
val share = Intent.createChooser(Intent(), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) }
Java
Intent shareIntent = Intent.createChooser(new Intent(), null); // Only use for components you have control over ComponentName[] excludedComponentNames = { new ComponentName("com.example.android", "ExampleClass") }; shareIntent.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames);
共有に関する情報を取得する
ユーザーが共有するタイミングや、ユーザーが選択したターゲットを把握すると便利です。「
Android Sharesheet では、次の ComponentName
を提供することでこの情報を取得できます。
IntentSender
を使用してユーザーが選択したものを対象とします。
まず、BroadcastReceiver
の PendingIntent
を作成し、
Intent.createChooser()
の IntentSender
:
Kotlin
var share = Intent(Intent.ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( myContext, requestCode, Intent(myContext, MyBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender)
Java
Intent share = new Intent(ACTION_SEND); ... PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode, new Intent(myContext, MyBroadcastReceiver.class), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); share = Intent.createChooser(share, null, pi.getIntentSender());
MyBroadcastReceiver
でコールバックを受け取り、
Intent.EXTRA_CHOSEN_COMPONENT
:
Kotlin
override fun onReceive(context: Context, intent: Intent) { ... val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Java
@Override public void onReceive(Context context, Intent intent) { ... ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Sharesheet にカスタム アクションを追加する
Android 14(API レベル 34)以降では、アプリは Android Sharesheet にカスタム アクションを追加できます。
ChooserAction
を作成する
ChooserAction.Builder
。
アイコンがクリックされたときに呼び出されるアクションとして PendingIntent
を指定できます。作成
すべてのカスタム操作を含む配列を作成し、
EXTRA_CHOOSER_CUSTOM_ACTIONS
(シェア Intent
)
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Android インテント リゾルバを使用する
Android インテント リゾルバが最もよく使われるのは、明確に定義されたタスクフローの一部として別のアプリにデータを渡す場合です。
Android インテント リゾルバを使用するには、通常どおりにインテントを作成し、エクストラを追加します。
Android Sharesheet をご覧ください。ただし、
Intent.createChooser()
。
一致するフィルタを持つインストール済みアプリケーションが複数ある場合
ACTION_SEND
および MIME タイプを入力すると、インテント リゾルバと呼ばれる曖昧性除去ダイアログがシステムによって表示されます。
ユーザーは共有先のターゲットを選択できます1 つのアプリケーションが
実行されます。
Android インテント リゾルバを使用してテキストを送信する例を以下に示します。
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } startActivity(sendIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); startActivity(sendIntent);
詳細
データの送信について詳しくは、このモジュールの インテントとインテント フィルタ。