暗黙的インテントを使用したときに選択されたアプリを知る

暗黙的インテントを使用したときにユーザがどのアプリを選択するか知るにはどうすればいいのか調査しました。 結論からいうと、Android 5.1以上から追加された次のAPIを利用することで、どのアプリを選択したかBroadcastReceiverで受け取ることができます。

public static Intent createChooser (Intent target, 
                CharSequence title, 
                IntentSender sender)

第三引数のIntentSenderはどうやって作るのかですが、PendingIntentgetIntentSender()というメソッドが用意されており、PendingIntentから取得するようです。

全体の流れは次になります。

  1. 選択された結果を受け取るためのBroadcastReceiverを用意する
  2. 受信先に1を指定したPendingIntentを用意する
  3. 発行したい暗黙的Intentを用意する
  4. 3のcreateChooserから取得したIntentをstartActivityに渡す

選択された結果を受け取るためのBroadcastReceiverを用意する

選択された結果を受け取るためのBroadcastReceiverを用意します。

class ChooseReceiver : BroadcastReceiver() {

  override fun onReceive(
    context: Context,
    intent: Intent
  ) {
    val componentName = intent.extras.get(EXTRA_CHOSEN_COMPONENT) as ComponentName
  }
}

manifestに追加することを忘れないようにします。

<receiver android:name="ChooseReceiver" android:exported="false"/>

受信先にさきほど作成したReceiverを指定したPendingIntentを用意する

val receiver = Intent(context, ChooseReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT)

発行したい暗黙的Intentを用意する

お好きな暗黙的Intentをご用意ください。

val share = Intent()
share.action = Intent.ACTION_SEND
share.type = "text/plain"
share.putExtra(
    Intent.EXTRA_TEXT,
    "テキスト"
)

createChooserから取得したIntentをstartActivityに渡す

    startActivity(Intent.createChooser(share
        , "タイトル"
        , pendingIntent.intentSender
    ))

以上です。

参考

Get results from Android Chooser – Code With Lisa – Medium