內部中介服務尚未對公眾開放使用
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 成功得標,應用程式範例就會載入廣告,否則便會顯示來自競投伺服器的錯誤訊息。