Posted at

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

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