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

概要

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アプリだけハッシュタグつけたい的なこともできるかと思います。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.