內部中介服務未公開供用戶使用
使用 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 贏得出價時載入廣告,或顯示競價伺服器收到的錯誤訊息。