内部中介不公开提供
内部 Audience Network 竞价现在处于封测阶段,不公开提供。如有变化,我们将提供最新信息。
作为替代方案,您可以通过与我们合作的中介平台访问 Audience Network 竞价。
本指南将向您介绍如何构建 Android 客户端应用。在下面的分步指南中,我们将使用该示例:在插屏广告中向您的竞拍服务器发送竞拍请求。请确保您已经熟悉 Audience Network 插屏广告的使用方法。竞价还支持原生广告、横幅广告、插屏广告、视频插播广告和激励视频广告格式。在使用除插屏广告外的广告格式时,您可以更改服务器设置。
我们需要在客户端上收集竞拍请求所需参数,然后使用 HTTP 请求将竞拍请求发送至竞拍服务器。以下 Android 实施示例展示的是发出由上述格式指定的竞拍请求:
private static JSONObject getRequest( Context context, String appId, String placementId, String idfa, int coppa, int dnt ) throws JSONException { JSONObject requestObject = new JSONObject(); requestObject.put("app_id", appId); requestObject.put("placement_id", placementId); requestObject.put("bundle", BuildConfig.APPLICATION_ID); requestObject.put("bundle_version", BuildConfig.VERSION_NAME); requestObject.put("ifa", idfa); // coppa and do not track flags requestObject.put("coppa", coppa); requestObject.put("dnt", dnt); requestObject.put( "buyer_tokens", (new JSONObject()) .put("audience_network", getAudienceNetworkBidderToken(context)) ); requestObject.put("test", Settings.isTestMode() ? 1 : 0); return requestObject; }
下面是一个静态函数的代码片段示例,该函数可以向服务器发送竞拍请求,并使用服务器响应调用回调方法:
public static void makeRequest( final Context context, final int coppa, final String appId, final String placementId, final AuctionRequestCallback callback ) { getThreadPoolExecutor().submit(new Runnable() { @Override public void run() { try { // Retrieve idfa and limit ad tracking settings NonProductionIDFAUtils.AdIdInfo adInfo = NonProductionIDFAUtils.getAdIdInfo(context); final JSONObject request = getRequest( context, appId, placementId, adInfo.idfa, coppa, adInfo.dnt); if (Settings.getServerAddress() == null) { throw new android.provider.Settings.SettingNotFoundException( "Server address settings not found"); } final URL url = new URL(Settings.getServerAddress()); JsonObjectRequest jsObjRequest = new JsonObjectRequest( Request.Method.POST, Settings.getServerAddress(), request, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { Log.d("response", response.toString()); String placementId = response.getString("placement_id"); String adFormat = response.getString("ad_format"); String platformName = response.getString("platform_name"); String platformPlacementId = response.getString( "platform_placement_id"); String payload = response.getString("bid_payload"); callback.onSuccess( placementId, adFormat, platformName, platformPlacementId, payload); } catch (JSONException e) { callback.onError(e); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if (error.networkResponse == null) { callback.onError(new Exception("Server response empty!")); } else { if(error.networkResponse.data != null) { callback.onError(new VolleyError( error.networkResponse.statusCode + " " + new String(error.networkResponse.data))); } else { callback.onError(new VolleyError("" + error.networkResponse.statusCode)); } } } } ); getRequestQueue(context).add(jsObjRequest); } catch (Exception e) { // Other errors Log.e("error", e.toString()); callback.onError(e); } } }); }
在客户端应用上,当 HTTP 请求返回时,将调用上文指定的回调方法。借助响应参数,我们可以判断哪个平台赢得了竞拍,然后加载广告。如果竞拍成功,并且 Audience Network 赢得了竞拍,则响应参数会包含一个我们可以从中加载广告的负载字符串。我们可以在正确的广告格式类上调用 loadAd(...)
方法,并将负载字符串作为竞价纳入 `LoadAdConfig,以加载广告。以下是我们采用的竞拍请求回调方法:
// AuctionRequestCallback public void onSuccess( String placementId, String adFormat, String platformName, String platformPlacementId, String payload) { if (platformName.contentEquals(PLATFORM_AUDIENCE_NETWORK)) { if (adFormat.contentEquals(INTERSTITIAL)) { statusLabel.setText(R.string.loading_ad); interstitialAd = new InterstitialAd(MainActivity.this, platformPlacementId); interstitialAd.loadAd( interstitialAd.buildLoadAdConfig() .withAdListener(MainActivity.this) .withBid(payload) .build()); } } } public void onError(Exception e) { Log.e(TAG, e.getMessage()); statusLabel.setText(e.getMessage()); }
由此,如果 Audience Network 赢得了竞价,则示例应用会加载广告,否则会显示从竞拍服务器收到的错误消息。