1

我目前正在尝试使用原生桥实现谷歌搜索广告,并且我能够在原生(android)上看到广告,并且我知道桥正在工作,因为我使用简单的原生按钮进行了测试,但我无法获得这些广告通过桥出现。

通过检查布局检查器,我可以看到 SearchAdView 已添加到带有 webview 子级的布局中,但 webview 的高度为 0。

任何人都有这方面的经验或知道可能出了什么问题?

这是 SDK https://developers.google.com/custom-search-ads/android/

还有我的实现(ids 是隐藏的)

反应面

import { requireNativeComponent } from 'react-native'

const GoogleAdView = requireNativeComponent('GoogleAdView')

export const GoogleAd = () => {
  const adRequest = {
    query: 'iphone',
    clientId: 'MY_VALID_CLIENT_ID',
    templateId: 'MY_TEMPLATE_ID',
    adTest: true
  }

  return (
    <GoogleAdView
      request={adRequest}
      style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}
    />
  )
})

安卓代码


import android.content.res.Resources
import android.util.Log
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.common.MapBuilder
import com.facebook.react.uimanager.SimpleViewManager
import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.annotations.ReactProp
import com.google.android.gms.ads.search.DynamicHeightSearchAdRequest


class ReactGoogleAdManager : SimpleViewManager<RctGoogleAd>() {
    private companion object {
        const val REACT_CLASS = "GoogleAdView"
        const val QUERY = "query"
        const val CLIENT_ID = "clientId"
        const val TEMPLATE_ID = "templateId"
        const val AD_TEST = "adTest"
    }

    override fun getName(): String {
        return REACT_CLASS
    }

    override fun createViewInstance(reactContext: ThemedReactContext): RctGoogleAd {
        return RctGoogleAd(reactContext)
    }

    @ReactProp(name = "request")
    fun loadAds(view: RctGoogleAd, requestMap: ReadableMap) {

        val (query, clientId, templateId, adTest) = parseRequestMap(requestMap)

        val displayMetrics = Resources.getSystem().displayMetrics
        val width = (view.width/displayMetrics.density).toInt()
        val height = (view.height/displayMetrics.density).toInt()
        Log.d("testlog", "container width: ${width}")
        Log.d("testlog", "container height: ${height}")

        val request = DynamicHeightSearchAdRequest.Builder()
                .setAdTest(adTest)
                .setQuery(query)
                .setNumber(1)
                .setAdvancedOptionValue("csa_adType", "plas")
                .setAdvancedOptionValue("csa_width", "128")
                .setAdvancedOptionValue("csa_height", "260")
                .setAdvancedOptionValue("csa_styleId", templateId)
                .build()

        view.searchAdView.loadAd(request)
    }

    private fun parseRequestMap(request: ReadableMap): Request {
        if (!request.hasKey(QUERY) ||
                !request.hasKey(CLIENT_ID) ||
                !request.hasKey(TEMPLATE_ID)) {
            throw IllegalArgumentException("Missing required arguments! request: $request")
        }

        val query = request.getString(QUERY)
        val clientId = request.getString(CLIENT_ID)
        val templateId = request.getString(TEMPLATE_ID)
        val adTest = if (request.hasKey(AD_TEST)) {
            request.getBoolean(AD_TEST)
        } else {
            false
        }

        return Request(query, clientId, templateId, adTest)
    }

    data class Request(val query: String?,
                       val clientId: String?,
                       val templateId: String?,
                       val adTest: Boolean)
}


import android.graphics.Color
import android.util.Log
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.ReactContext
import com.facebook.react.uimanager.events.RCTEventEmitter
import com.facebook.react.views.view.ReactViewGroup
import com.google.android.gms.ads.AdListener
import com.google.android.gms.ads.AdSize
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.search.SearchAdView

class RctGoogleAd(val reactContext: ReactContext) : ReactViewGroup(reactContext) {
    val searchAdView: SearchAdView

    init {
        searchAdView = SearchAdView(reactContext).apply {
            adUnitId = "MY_ADUNIT_ID"
            adSize = AdSize.SEARCH
            adListener = object : AdListener() {
                override fun onAdLoaded() {
                    super.onAdLoaded()

                    Log.d("testlog", "loaded")

                    val parent = this@RctGoogleAd

                    measure(MeasureSpec.makeMeasureSpec(parent.width, MeasureSpec.EXACTLY),
                            MeasureSpec.makeMeasureSpec(parent.height, MeasureSpec.EXACTLY))
                    layout(parent.left, parent.top, parent.left + parent.width, parent.top + parent.height)
                }

                override fun onAdFailedToLoad(error: LoadAdError) {
                    super.onAdFailedToLoad(error)
                    Log.d("testlog", error.message)

                }
            }
        }
        addView(searchAdView)
    }
}
4

0 回答 0