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

Android では、インテントとそれに関連するエクストラを使用して、ユーザーが情報をすばやく共有できるようにしています。 簡単に利用できます。

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

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

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

Android Sharesheet を使用する理由

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

Android Sharesheet を使用すると、他のユーザーと情報を共有できます。 適切な人物に適切なおすすめのアプリを提示できます。 Sharesheet は、カスタム ソリューションでは利用できないターゲットを提案でき、一貫したランキングを使用します。 これは、Sharesheet がアプリとユーザーのアクティビティに関する情報を考慮できるためです。 システムでのみ利用可能な リソースがあります

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

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_EMAILEXTRA_CC, EXTRA_BCC)、 メールの件名 (EXTRA_SUBJECT)など

注: Gmail などの一部のメールアプリでは、 String[]: その他の特典 EXTRA_EMAILEXTRA_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/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
サポートされているファイル拡張子 application/pdf

<ph type="x-smartling-placeholder">

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

まず、BroadcastReceiverPendingIntent を作成し、 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 インテント リゾルバを使用する

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

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

詳細

データの送信について詳しくは、このモジュールの インテントとインテント フィルタ。