Help us understand the problem. What is going on with this article?

シェアするアプリによって挙動を変更する

More than 1 year has passed since last update.

概要

Intent.createChooser を使ってシェアをする際に特定のアプリだけ挙動を変更したいということがありました。今回はメールアプリの場合だけ件名をつけることをゴールにします。

特に難しい内容ではなかったのですが備忘録として投稿します。

実装

特定のアプリだけ定義します。

enum class App(val packageName: String) {
    Gmail("com.google.android.gm"),
}

判定はこんな感じです。

/**
 * enumで定義したパッケージ名に存在するか確認
 */
private fun isMail(packageName: String): Boolean =
        App.values().filter { packageName.contains(it.packageName) }.count() > 0

少し長いですがシェアするときは次のようにします。

private fun share() {
    val targets: MutableList<Intent> = mutableListOf()
    val resolveInfoList = packageManager.queryIntentActivities(Intent().actionSend(), PackageManager.MATCH_ALL)
    resolveInfoList.forEach {
        val packageName = it.activityInfo.packageName
        targets.add(Intent().actionSend().apply {
            `package` = packageName
            setClassName(packageName, it.activityInfo.name)
            when (isMail(packageName)) {
                true -> putExtra(Intent.EXTRA_SUBJECT, "subject...")
                else -> putExtra(Intent.EXTRA_SUBJECT, "")
            }
            putExtra(Intent.EXTRA_TEXT, "message...")
        })
    }

    if (targets.isNotEmpty()) {
        val chooserIntent = Intent.createChooser(Intent(), "共有").apply {
            putExtra(Intent.EXTRA_INITIAL_INTENTS, targets.toTypedArray())
        }
        startActivity(chooserIntent)
    }
}

private fun Intent.actionSend(): Intent = Intent().apply {
    action = Intent.ACTION_SEND
    type = "text/plain"
}

以上

Twitterアプリだけハッシュタグつけたい的なこともできるかと思います。

aluceps
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away