他のアプリにシンプルなデータを送信する

Android では、インテントとそれに関連する追加機能を使用することにより、ユーザーがアプリで情報をすばやく簡単に共有できるようになっています。

Android では、ユーザーがアプリ間でデータを共有するのに、2 つの方法があります。

  • Android Sharesheet は主に、アプリの外部へのコンテンツの送信、別ユーザーへの直接のコンテンツの送信、またはその両方のために設計されています。たとえば、友人との URL の共有などです。
  • Android のインテント リゾルバは、 明確に定義されたタスクの次のステージに移ります。たとえば、アプリから PDF を開き、ユーザーにビューアを選択させるなどです。

インテントを作成するときに、インテントに実行させるアクションを指定します。Android がアクション ACTION_SEND を使用する あるアクティビティから別のアクティビティにデータを送信する プロセス境界を越えて可視化できます。データとそのタイプを指定する必要があります。システムは、データの受信が可能な互換性のあるアクティビティを自動的に見つけて、ユーザーに表示します。インテント リゾルバの場合、インテントを処理できるアクティビティが 1 つだけであれば、そのアクティビティがすぐに開始されます。

Android Sharesheet を使用する理由

Android Sharesheet を使用して、ユーザー間での一貫性を保つことを強くおすすめします。 。アプリ独自の共有ターゲットのリストを表示したり、独自の Sharesheet バリエーションを作成したりしないでください。

Android Sharesheet を使用すると、ユーザーは適切な人と情報を共有できます。このとき、関連するアプリが推奨され、すべて 1 回のタップで行うことができます。Sharesheet は、カスタム ソリューションでは利用できないターゲットを、一貫したランキングでおすすめします。これは、Sharesheet が、システムでのみ利用可能な、アプリとユーザーのアクティビティに関する情報を考慮できるためです。

また、Android Sharesheet には、デベロッパーにとって便利な機能が多数あります。たとえば 次の操作を行います。

Android Sharesheet を使用する

すべてのタイプの共有について、インテントを作成し、そのアクションを Intent.ACTION_SEND に設定します。Android Sharesheet を表示するには、次の呼び出しを呼び出します。 Intent.createChooser()Intent オブジェクトを渡します。 Android Sharesheet を常に表示するバージョンのインテントが返されます。

テキスト コンテンツを送信する

最も簡単で一般的な Android Sharesheet の使用方法は、あるアクティビティから別のアクティビティにテキスト コンテンツを送信することです。たとえば、ほとんどのブラウザは、現在表示されているページの URL をテキストとして別のアプリと共有できます。これは、メールやソーシャル ネットワークで友人と記事やウェブサイトを共有するのに便利です。以下はその方法の例です。

KotlinJava
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)
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_EMAILEXTRA_CCEXTRA_BCC)や件名(EXTRA_SUBJECT)などの情報を、補足情報として追加できます。

注: Gmail などの一部のメールアプリでは、 String[]: その他の特典 EXTRA_EMAILEXTRA_CC。使用 putExtra(String, String[]) これらをインテントに追加します。

バイナリ コンテンツを送信する

ACTION_SEND アクションを使用してバイナリデータを共有します。適切な MIME タイプを設定し、エクストラ EXTRA_STREAM、 表示されます。 これは通常、画像の共有に使用されますが、任意のバイナリ コンテンツの共有にも使用できます。

KotlinJava
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))
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 ごとのパーミッションを使用することです。簡単に ContentProvider は、 FileProvider ヘルパークラス。
  • システム MediaStore を使用する。MediaStore は主に動画、音声、画像の MIME タイプ用です。ただし、Android 3.0(API レベル 11)以降では、メディア以外のタイプも保存できます。詳細については、MediaStore.Files をご覧ください。ファイルは、次のコマンドを使用して MediaStore に挿入できます。 scanFile(), その後、 content:// スタイルの Uri 指定したユーザー グループに onScanCompleted() 呼び出すことができます。システム MediaStore に追加されると、そのコンテンツはデバイス上のすべてのアプリからアクセスできるようになることに注意してください。

正しい MIME タイプを使用する

送信するデータに使用できる最も限定的な MIME タイプを指定します。たとえば、書式なしテキストを共有する場合は text/plain を使用します。Android 内でシンプルなデータを送信する際の一般的な MIME タイプを以下に示します。

受取人は 送信者からの送信
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
サポートされているファイル拡張子 application/pdf

MIME タイプの詳細については、MIME メディアタイプの IANA 公式レジストリをご覧ください。

Android Sharesheet は、指定された MIME タイプに応じてコンテンツ プレビューを表示する場合があります。一部 プレビュー機能は特定のタイプでのみ使用できます。

複数のコンテンツを共有する

複数のコンテンツを共有するには、コンテンツを指す URI のリストを添えて、ACTION_SEND_MULTIPLE アクションを使用します。MIME タイプは、ファイルの種類によって コンテンツの混在環境を考慮する必要があります。たとえば、3 つの JPEG 画像を共有する場合は、タイプ "image/jpg" を使用します。画像タイプが混在している場合は、"image/*" を使用して、任意のタイプの画像を処理するアクティビティを照合します。複数のタイプを混在させて共有することもできますが、 おすすめできません。これは、 何を送信するのかが受信者にわかりません。複数タイプを送る必要がある場合は、"*/*" を使用します。データの解析と処理は、受信アプリケーションで行います。次の例をご覧ください。

KotlinJava
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))
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 をご覧ください。

次の例をご覧ください。

KotlinJava
 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)
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));

プレビューは次のようになります。

共有シートにカスタム アクションを追加する

Android の共有シートのカスタム アクションのスクリーンショット。

Android 14(API レベル 34)以降では、アプリは Android 共有シートにカスタム アクションを追加できます。カスタム アクションは、Android Sharesheet とアプリの上部に小さなアクション アイコンとして表示されます。 アイコンがクリックされたときに呼び出されるアクションとして任意の Intent を指定できます。

Android Sharesheet にカスタム アクションを追加するには、まず ChooserAction ChooserAction.Builder。 アイコンがクリックされたときに呼び出されるアクションとして PendingIntent を指定できます。作成 すべてのカスタム操作を含む配列を作成し、 EXTRA_CHOOSER_CUSTOM_ACTIONS (シェア Intent

KotlinJava
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)
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.createChooser() を呼び出したで、Intent.EXTRA_CHOOSER_TARGETSIntent.EXTRA_INITIAL_INTENTS をインテントに追加します。

KotlinJava
val share = Intent.createChooser(myShareIntent, null).apply {
    putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray)
    putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray)
}
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 を追加します。

KotlinJava
  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)
  }
  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 を使用してユーザーが選択したものを対象とします。

まず、BroadcastReceiverPendingIntent を作成して、その IntentSenderIntent.createChooser() に渡します。

KotlinJava
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)
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:

KotlinJava
override fun onReceive(context: Context, intent: Intent) {
  ...
  val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT);
}
@Override public void onReceive(Context context, Intent intent) {
  ...
  ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT);
}

共有シートにカスタム アクションを追加する

Android 14(API レベル 34)以降では、アプリは Android Sharesheet にカスタム アクションを追加できます。 ChooserAction.BuilderChooserAction を作成します。アイコンがクリックされたときに呼び出されるアクションとして PendingIntent を指定できます。すべてのカスタム アクションを含む配列を作成し、共有 IntentEXTRA_CHOOSER_CUSTOM_ACTIONS として指定します。

KotlinJava
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)
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 インテント リゾルバを使用する

ACTION_SEND インテント リゾルバのスクリーンショット

Android インテント リゾルバが最もよく使われるのは、明確に定義されたタスクフローの一部として別のアプリにデータを渡す場合です。

Android インテント リゾルバを使用するには、通常どおりにインテントを作成し、エクストラを追加します。 Android Sharesheet をご覧ください。ただし、 Intent.createChooser()

ACTION_SEND および MIME タイプが一致するフィルタを持つアプリケーションが複数インストールされている場合、システムは、インテント リゾルバと呼ばれる曖昧さ回避のダイアログを表示して、ユーザーが共有先を選択できるようにします。一致するアプリケーションが 1 つであれば、そのアプリケーションが実行されます。

Android インテント リゾルバを使用してテキストを送信する例を以下に示します。

KotlinJava
val sendIntent: Intent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
    type = "text/plain"
}
startActivity(sendIntent)
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);

詳細

データの送信の詳細については、インテントとインテント フィルタをご覧ください。