伺服器對伺服器: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 贏得出價時載入廣告,或顯示競價伺服器收到的錯誤訊息。

後續步驟