伺服器對伺服器:Android 用戶端設定指南

內部中介服務尚未對公眾開放使用

Audience Network 的內部出價功能目前為不公開測試版,尚未對公眾開放使用。如有任何變更,我們將會公佈最新消息。

您可以考慮改為透過與我們合作的其中一個中介服務平台使用 Audience Network 出價功能。

本指南將為您講解如何建立 Android 用戶端應用程式。在以下的詳細指南中,我們將會使用在插頁廣告中向您的競投伺服器傳送競投要求的範例。請確保您已熟悉 Audience Network 插頁廣告的使用方法。出價功能亦支援原生廣告、橫額廣告、插頁廣告、插播影片和獎勵式影片廣告格式。使用插頁廣告以外的廣告格式時,您可以變更伺服器設定

必要條件

Android 用戶端設定步驟

第 1 步:從 Android 用戶端作出競投要求

第 2 步:從 Android 用戶端的出價回應載入廣告

Android 用戶端設定步驟

第 1 步:從 Android 用戶端作出競投要求

我們需要在用戶端收集競投要求的所需參數,然後使用 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);
            }
        }
    });
}

第 2 步:從 Android 用戶端的出價回應載入廣告

在用戶端應用程式,當系統傳回 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 成功得標,應用程式範例就會載入廣告,否則便會顯示來自競投伺服器的錯誤訊息。

後續步驟