privatevoidsetOnPaidEventListener(RewardedAdad){ad.setOnPaidEventListener(newOnPaidEventListener(){@OverridepublicvoidonPaidEvent(@NonNullAdValueadValue){// Extract the impression-level ad revenue data.longvalueMicros=adValue.getValueMicros();StringcurrencyCode=adValue.getCurrencyCode();intprecision=adValue.getPrecisionType();// Get the ad unit ID.StringadUnitId=ad.getAdUnitId();// Extract ad response information.AdapterResponseInfoloadedAdapterResponseInfo=ad.getResponseInfo().getLoadedAdapterResponseInfo();if(loadedAdapterResponseInfo!=null){StringadSourceName=loadedAdapterResponseInfo.getAdSourceName();StringadSourceId=loadedAdapterResponseInfo.getAdSourceId();StringadSourceInstanceName=loadedAdapterResponseInfo.getAdSourceInstanceName();StringadSourceInstanceId=loadedAdapterResponseInfo.getAdSourceInstanceId();Bundleextras=ad.getResponseInfo().getResponseExtras();StringmediationGroupName=extras.getString("mediation_group_name");StringmediationABTestName=extras.getString("mediation_ab_test_name");StringmediationABTestVariant=extras.getString("mediation_ab_test_variant");}}});}
privatefunsetOnPaidEventListener(ad:RewardedAd){ad.onPaidEventListener=OnPaidEventListener{adValue->
// Extract the impression-level ad revenue data.valvalueMicros=adValue.valueMicrosvalcurrencyCode=adValue.currencyCodevalprecision=adValue.precisionType// Get the ad unit ID.valadUnitId=ad.adUnitId// Extract ad response information.valloadedAdapterResponseInfo=ad.responseInfo.loadedAdapterResponseInfovaladSourceName=loadedAdapterResponseInfo?.adSourceNamevaladSourceId=loadedAdapterResponseInfo?.adSourceIdvaladSourceInstanceName=loadedAdapterResponseInfo?.adSourceInstanceNamevaladSourceInstanceId=loadedAdapterResponseInfo?.adSourceInstanceIdvalextras=ad.responseInfo.responseExtrasvalmediationGroupName=extras.getString("mediation_group_name")valmediationABTestName=extras.getString("mediation_ab_test_name")valmediationABTestVariant=extras.getString("mediation_ab_test_variant")}}
[null,null,["最后更新时间 (UTC):2025-08-31。"],[],[],null,["When an impression occurs, Google Mobile Ads SDK provides ad revenue data\nassociated with that impression. You can use the data to calculate a user's\nlifetime value, or forward the data downstream to other relevant systems.\n\nThis guide is intended to help you implement the impression-level ad revenue\ndata capture in your Android app.\n\nPrerequisites\n\n- Make sure you have [turned on the impression-level ad revenue feature](//support.google.com/admanager/answer/13404416) in the Ad Manager UI.\n\n\u003c!-- --\u003e\n\n- Import the Google Mobile Ads SDK 21.1.0 or higher.\n\n\u003c!-- --\u003e\n\n- Complete the [Get started guide](/ad-manager/mobile-ads-sdk/android/quick-start).\n- Before you can receive any impression-level ad revenue, you need to implement\n at least one ad format:\n\n - [App open](/ad-manager/mobile-ads-sdk/android/app-open)\n - [Banner](/ad-manager/mobile-ads-sdk/android/banner)\n - [Interstitial](/ad-manager/mobile-ads-sdk/android/interstitial)\n - [Rewarded](/ad-manager/mobile-ads-sdk/android/rewarded)\n - [Rewarded interstitial](/ad-manager/mobile-ads-sdk/android/rewarded-interstitial)\n - [Native](/ad-manager/mobile-ads-sdk/android/native)\n\nPaid event handler\n\nEach ad format has an\n\n[`OnPaidEventListener`](/ad-manager/mobile-ads-sdk/android/reference/com/google/android/gms/ads/OnPaidEventListener).\n\nDuring the lifecycle of an ad event, Google Mobile Ads SDK monitors\nimpression events and invokes the handler with an earned value.\n\nThe following example handles paid events for a rewarded ad: \n\nJava \n\n private void setOnPaidEventListener(RewardedAd ad) {\n ad.setOnPaidEventListener(\n new OnPaidEventListener() {\n @Override\n public void onPaidEvent(@NonNull AdValue adValue) {\n // Extract the impression-level ad revenue data.\n long valueMicros = adValue.getValueMicros();\n String currencyCode = adValue.getCurrencyCode();\n int precision = adValue.getPrecisionType();\n\n // Get the ad unit ID.\n String adUnitId = ad.getAdUnitId();\n\n // Extract ad response information.\n AdapterResponseInfo loadedAdapterResponseInfo =\n ad.getResponseInfo().getLoadedAdapterResponseInfo();\n if (loadedAdapterResponseInfo != null) {\n String adSourceName = loadedAdapterResponseInfo.getAdSourceName();\n String adSourceId = loadedAdapterResponseInfo.getAdSourceId();\n String adSourceInstanceName = loadedAdapterResponseInfo.getAdSourceInstanceName();\n String adSourceInstanceId = loadedAdapterResponseInfo.getAdSourceInstanceId();\n\n Bundle extras = ad.getResponseInfo().getResponseExtras();\n String mediationGroupName = extras.getString(\"mediation_group_name\");\n String mediationABTestName = extras.getString(\"mediation_ab_test_name\");\n String mediationABTestVariant = extras.getString(\"mediation_ab_test_variant\");\n }\n }\n });\n } \n https://github.com/googleads/googleads-mobile-android-examples/blob/ccc290a583d7f552bdcf81ea76adc05beaa43f0b/java/advanced/APIDemo/app/src/main/java/com/google/android/gms/snippets/ImpressionLevelAdRevenueSnippets.java#L30-L59\n\nKotlin \n\n private fun setOnPaidEventListener(ad: RewardedAd) {\n ad.onPaidEventListener = OnPaidEventListener { adValue -\u003e\n // Extract the impression-level ad revenue data.\n val valueMicros = adValue.valueMicros\n val currencyCode = adValue.currencyCode\n val precision = adValue.precisionType\n\n // Get the ad unit ID.\n val adUnitId = ad.adUnitId\n\n // Extract ad response information.\n val loadedAdapterResponseInfo = ad.responseInfo.loadedAdapterResponseInfo\n val adSourceName = loadedAdapterResponseInfo?.adSourceName\n val adSourceId = loadedAdapterResponseInfo?.adSourceId\n val adSourceInstanceName = loadedAdapterResponseInfo?.adSourceInstanceName\n val adSourceInstanceId = loadedAdapterResponseInfo?.adSourceInstanceId\n val extras = ad.responseInfo.responseExtras\n val mediationGroupName = extras.getString(\"mediation_group_name\")\n val mediationABTestName = extras.getString(\"mediation_ab_test_name\")\n val mediationABTestVariant = extras.getString(\"mediation_ab_test_variant\")\n }\n } \n https://github.com/googleads/googleads-mobile-android-examples/blob/ccc290a583d7f552bdcf81ea76adc05beaa43f0b/kotlin/advanced/APIDemo/app/src/main/java/com/google/android/gms/snippets/ImpressionLevelAdRevenueSnippets.kt#L26-L47\n\nIdentify a custom event ad source name\n\nFor custom event ad sources, the [`getAdSourceName()`](/ad-manager/mobile-ads-sdk/android/reference/com/google/android/gms/ads/AdapterResponseInfo#getAdSourceName()) method\nreturns the ad source name `Custom event`. If you use multiple custom\nevents, the ad source name isn't granular enough to distinguish between multiple\ncustom events. To locate a specific custom event, do:\n\n1. Call the [`getAdSourceName()`](/ad-manager/mobile-ads-sdk/android/reference/com/google/android/gms/ads/AdapterResponseInfo#getAdSourceName()) method.\n2. Set a unique ad source name.\n\nThe following example sets a unique ad source name for a custom event: \n\nJava \n\n private String getUniqueAdSourceName(@NonNull AdapterResponseInfo loadedAdapterResponseInfo) {\n\n String adSourceName = loadedAdapterResponseInfo.getAdSourceName();\n if (adSourceName.equals(\"Custom Event\")) {\n if (loadedAdapterResponseInfo\n .getAdapterClassName()\n .equals(\"com.google.ads.mediation.sample.customevent.SampleCustomEvent\")) {\n adSourceName = \"Sample Ad Network (Custom Event)\";\n }\n }\n return adSourceName;\n } \n https://github.com/googleads/googleads-mobile-android-examples/blob/ccc290a583d7f552bdcf81ea76adc05beaa43f0b/java/advanced/APIDemo/app/src/main/java/com/google/android/gms/snippets/ResponseInfoSnippets.java#L29-L41\n\nKotlin \n\n private fun getUniqueAdSourceName(loadedAdapterResponseInfo: AdapterResponseInfo): String {\n\n var adSourceName = loadedAdapterResponseInfo.adSourceName\n if (adSourceName == \"Custom Event\") {\n if (\n loadedAdapterResponseInfo.adapterClassName ==\n \"com.google.ads.mediation.sample.customevent.SampleCustomEvent\"\n ) {\n adSourceName = \"Sample Ad Network (Custom Event)\"\n }\n }\n return adSourceName\n } \n https://github.com/googleads/googleads-mobile-android-examples/blob/ccc290a583d7f552bdcf81ea76adc05beaa43f0b/kotlin/advanced/APIDemo/app/src/main/java/com/google/android/gms/snippets/ResponseInfoSnippets.kt#L24-L37\n\n\u003cbr /\u003e\n\nFor more information on the winning ad source, see [Retrieve information about\nthe ad response](/ad-manager/mobile-ads-sdk/android/response-info).\n\nImplementation best practices\n\n- Set the listener immediately once you create or get access to the ad object, and definitely before showing the ad. This makes sure that you don't miss any paid event callbacks.\n- Send the impression-level ad revenue information to your preferred analytics server immediately at the time the paid event callback is called. This makes sure that you don't accidentally drop any callbacks and avoids data discrepancies.\n\nAdValue\n\n`AdValue` is a class that represents the monetary value earned for an ad,\nincluding the value's currency code and its precision type encoded as follows.\n| **Key Point:** [`getValueMicros()`](/ad-manager/mobile-ads-sdk/android/reference/com/google/android/gms/ads/AdValue#public-long-getvaluemicros) returns the value of the ad in micro units. For example, a `getValueMicros()` returned value of 5,000 means the ad is estimated to be worth $0.005.\n\n| PrecisionType | Description |\n|----------------------|--------------------------------------------------------------------------------------------------------------------|\n| `UNKNOWN` | An ad value that's unknown. This gets returned when LTV pingback is enabled but there isn't enough data available. |\n| `ESTIMATED` | An ad value estimated from aggregated data. |\n| `PUBLISHER_PROVIDED` | A publisher provided ad value, such as manual CPMs in a mediation group. |\n| `PRECISE` | The precise value paid for this ad. |\n\nIn case of mediation, Ad Manager tries to provide an `ESTIMATED` value for ad sources that have [automatic data collection](//support.google.com/admanager/answer/6240051) enabled. For non-optimized ad sources, or in cases where there aren't enough aggregated data to report a meaningful estimation, the `PUBLISHER_PROVIDED` value is returned.\n\n\u003cbr /\u003e\n\nTest impressions from Open Bidding\n\nAfter an impression-level ad revenue event occurs for\nan Open Bidding\nad source through a test request, you receive only the following\nvalues:\n\n- `UNKNOWN`: indicates the precision type.\n\n\u003c!-- --\u003e\n\n- `0`: indicates the ad value.\n\nPreviously, you might have seen the precision type as a value other than\n`UNKNOWN` and an ad value more than `0`.\n\nFor details on sending a test ad request, see\n[Enable test devices](/ad-manager/mobile-ads-sdk/android/test-ads#enable-test-devices)."]]