🪧

Jetpack composeでAdMobを表示する

に公開

割と雑に書いてます。
書いたはいいけど半年くらい公開忘れていたので最新バージョンと乖離はあるかもしれません。

AdMob はまだ Jetpack compose 非対応

https://developers.google.com/admob/android/banner

方法

AndroidView で表示します。

サンプルコード

@Composable
fun App() {
    Scaffold(
        bottomBar = {
            AdBanner(
                modifier = Modifier
                    .fillMaxWidth()
                    // パンチホールなどを回避
                    .windowInsetsPadding(insets = WindowInsets.safeDrawing.only(sides = WindowInsetsSides.Horizontal))
                    .navigationBarsPadding(),
            )
        },
    ) {
        // content...
    }
}

@Composable
private fun AdBanner(modifier: Modifier = Modifier) {
    // アダプティブバナーで表示するために端末の横幅を取得
    val adWidth = LocalConfiguration.current.screenWidthDp

    AndroidView(
        factory = { context ->
            AdView(context).apply {
                adUnitId = "ca-app-pub-3940256099942544/6300978111" // Test id
                setAdSize(AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, adWidth))
                loadAd(AdRequest.Builder().build())
            }
        },
        modifier = modifier,
    )
}

細かな点

アダプティブバナー

アダプティブバナーで表示したいので端末の横幅を取得して AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, adWidth) を設定しています。

LocalConfiguration.current.screenWidthDp

2 pane とかにしている場合は、このままだと突き抜けたりすると思うので適宜変更が必要。

スクリーンショット

AdMobを表示している縦画面のスクリーンショット
縦表示

AdMobを表示している横画面のスクリーンショット
横表示

かんそう 🤔

AndroidView は便利だけど、Jetpack compose のコードと View のコードで割と読み方が変わって脳内が忙しくなるので、できれば公式で対応してくれると嬉しい。

Discussion