Android(Kotlin)でSNSアプリを開くintentを書きたいときに使えるスニペット

3 min読了の目安(約2700字TECH技術記事

Androidで各SNSのアプリを持っていたらアプリを開く、持っていなかったらブラウザで開く、を実現するスニペットを作りました。

用意したのはYouTube、Instagram、Twitter、Facebook、Lineです。それぞれユーザーの個別ページに遷移するようになっています。ブラウザにはCustomTabsを使っていますが、好みに合わせて書き換えてください。

   //YouTube
   fun navigateToYouTubeUserPage(userId: String, context: Context) {
       val url = "https://www.youtube.com/$userId"
       try {
           Intent(Intent.ACTION_VIEW).also {
               it.setPackage("com.google.android.youtube")
               it.data = Uri.parse(url)
               context.startActivity(it)
           }
       } catch (e: ActivityNotFoundException) {
           navigateToCustomTab(url, context)
       }
   }

   //Instagram
   fun navigateToInstagramUserPage(userId: String, context: Context) {
       val url = "http://instagram.com/$userId"
       try {
           Intent(Intent.ACTION_VIEW).also {
               it.setPackage("com.instagram.android")
               it.data = Uri.parse(url)
               context.startActivity(it)
           }
       } catch (e: ActivityNotFoundException) {
           navigateToCustomTab(url, context)
       }
   }

   //Twitter
   fun navigateToTwitterUserPage(userId: String, context: Context) {
       val url = "https://twitter.com/$userId"
       try {
           Intent(Intent.ACTION_VIEW).also {
               it.setPackage("com.twitter.android")
               it.data = Uri.parse(url)
               context.startActivity(it)
           }
       } catch (e: ActivityNotFoundException) {
           navigateToCustomTab(url, context)
       }
   }

   //Facebook
   fun navigateToFacebookUserPage(userId: String, context: Context) {
       val url = "https://www.facebook.com/$userId"
       try {
           Intent(Intent.ACTION_VIEW).also {
               it.setPackage("com.facebook.katana")
               it.data = Uri.parse("fb://facewebmodal/f?href=$url")
               context.startActivity(it)
           }
       } catch (e: ActivityNotFoundException) {
           navigateToCustomTab(url, context)
       }
   }

   //Line
   fun navigateToLineOfficialAccountPage(lineId: String, context: Context) {
       try {
           Intent(Intent.ACTION_VIEW).also {
               it.setPackage("jp.naver.line.android")
               it.data = Uri.parse("line://ti/p/$lineId")
               context.startActivity(it)
           }
       } catch (e: ActivityNotFoundException) {
           navigateToCustomTab("https://line.me/ti/p/$lineId", context)
       }
   }

   //Custom Tab
   fun navigateToCustomTab(url: String, context: Context) {
       val uri = Uri.parse(url)
       CustomTabsIntent.Builder().also { builder ->
           builder.setShowTitle(true)
           builder.build().also {
               it.launchUrl(context, uri)
           }
       }
   }

これを作ったのは少し前なので、動かなかったら教えて下さい。