使用脈衝外掛程式與安卓版本的原生 SDK 搭配使用

在本主題中,您將學習如何使用 Pulse 外掛程式搭配布萊特灣的 Android 原生 SDK。

簡介

Brightcove的Pulse插件使您能夠將Invidi的Pulse SDK與Android的Brightcove本機SDK集成在一起。Pulse是一個視頻廣告平台。有關廣告系列和配置的詳細信息,請參見用戶指南

步驟

在Pulse平台中創建廣告系列後,您可以開始使用適用於Android的Brightcove Native SDK的Pulse插件。請按照以下步驟將Pulse插件與您的項目集成:

  1. 在您的模塊中build.gradle文件,添加Pulse插件依賴項。

    dependencies {
        implementation 'com.brightcove.player:android-pulse-plugin:6.12.0'
    }
  2. 下載Pulse SDK .aar文件

  3. 在你的應用/庫文件夾,打開build.gradle文件中的文件。修改以下內容:

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
    }
  4. 在你的MainActivity.java文件,通過實例化一個來初始化Pulse Plugin PulseComponent使用為您的廣告系列創建的Pulse主機URL。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        // Creating pulse component
        PulseComponent pulseComponent = new PulseComponent(
                "your pulse host url",
                brightcoveVideoView.getEventEmitter(),
                brightcoveVideoView);
        // ...
    }
  5. 設置PulseComponent聽眾。

    pulseComponent.setListener(new PulseComponent.Listener() {
      @NonNull
      @Override
      public PulseSession onCreatePulseSession(
        @NonNull String hostUrl,
        @NonNull Video video,
        @NonNull ContentMetadata contentMetadata,
        @NonNull RequestSettings requestSettings) {
        // See step 3a
        return Pulse.createSession(contentMetadata, requestSettings);
      }
    
      @Override
      public void onOpenClickthrough(@NonNull PulseVideoAd pulseVideoAd) {
      }
    });
  6. 實施onCreatePulseSession方法,它創建一個PulseSession並將其返回給PulseComponent。有三個參數:

    • 脈衝主機
    • 內容元數據設置
    • 請求設置

    @NonNull
    @Override
    public PulseSession onCreatePulseSession(
        @NonNull String hostUrl,
        @NonNull Video video,
        @NonNull ContentMetadata contentMetadata,
        @NonNull RequestSettings requestSettings) {
      // Set the pulse Host:
      Pulse.setPulseHost(pulseHostUrl, null, null);
    
      // Content metadata settings
      contentMetadata.setCategory("skip-always");
      contentMetadata.setTags(Collections.singletonList("standard-linears"));
      contentMetadata.setIdentifier("demo");
    
      // Request Settings:
      // Adding mid-rolls
      List<Float> midrollCuePoints = new ArrayList<>();
      midrollCuePoints.add(60f);
      requestSettings.setLinearPlaybackPositions(midrollCuePoints);
    
      // Create and return the PulseSession
      return Pulse.createSession(contentMetadata, requestSettings);
    }
  7. 實施onOpenClickthrough方法,當學到更多單擊線性廣告中的按鈕。此回調的典型操作是使用預期的URL打開瀏覽器。

    @Override
    public void onOpenClickthrough(@NonNull PulseVideoAd pulseVideoAd) {
      Intent intent = new Intent(Intent.ACTION_VIEW)
        .setData(Uri.parse(pulseVideoAd.getClickthroughURL().toString()));
      brightcoveVideoView.getContext().startActivity(intent);
      pulseVideoAd.adClickThroughTriggered();
    }
  8. 播放您的內容

    Catalog catalog = new Catalog.Builder(
      eventEmitter,
      getString(R.string.account))
      .setPolicy(getString(R.string.policy))
      .build();
    
    catalog.findVideoByID(getString(R.string.videoId), new VideoListener() {
      // Add the video found to the queue with add().
      // Start playback of the video with start().
      @Override
      public void onVideo(Video video) {
        brightcoveVideoView.add(video);
        brightcoveVideoView.start();
      }
    });

脈衝暫停廣告

當Pulse廣告系列配置了“暫停廣告”時,當內容暫停時,Pulse插件將向用戶顯示。

處理錯誤

使用EventType.AD_ERROR事件將所有錯誤顯示給開發人員,如下所示:

eventEmitter.on(EventType.AD_ERROR, event -> {
    Throwable error = event.getProperty(Event.ERROR, Throwable.class);
    Log.e(TAG, "AD_ERROR: ", error);
});

用戶界面自定義

在內部,Pulse插件會膨脹PulseAdView使用R.layout.pulse_ad_view佈局ID。對於其他佈局,您可以創建一個具有相同名稱的佈局文件,並將其添加到分辨率/佈局目錄。這將覆蓋默認佈局。

使用以下ID替換默認值:

元件視圖
元件視圖
索引 查看類型 查看ID
一個 文字檢視 pulse_ad_number_view
B 文字檢視 pulse_ad_countdown_view
C 文字檢視 pulse_ad_name_view
D 文字檢視 pulse_ad_learn_more_view
電子 文字檢視 pulse_skip_ad_view

完整的代碼樣本

這是將Pulse插件與Android Native SDK一起使用的完整代碼示例。

活動

這是完整活動代碼的示例:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      setContentView(R.layout.activity_main);

      final BrightcoveVideoView videoView = findViewById(R.id.video_view);
      super.onCreate(savedInstanceState);

      EventEmitter eventEmitter = videoView.getEventEmitter();

      // Pulse setup
      PulseComponent pulseComponent = new PulseComponent(
          "https://pulse-demo.videoplaza.tv",
          eventEmitter,
          videoView);

      pulseComponent.setListener(new PulseComponent.Listener() {
          @NonNull
          @Override
          public PulseSession onCreatePulseSession(
                @NonNull String pulseHostUrl,
                @NonNull Video video,
                @NonNull ContentMetadata contentMetadata,
                @NonNull RequestSettings requestSettings) {
            Pulse.setPulseHost(pulseHostUrl, null, null);
            contentMetadata.setCategory("skip-always");
            contentMetadata.setTags(Collections.singletonList("standard-linears"));
            contentMetadata.setIdentifier("demo");

            // Adding mid-rolls
            List<Float> midrollCuePoints = new ArrayList<>();
            midrollCuePoints.add(60f);
            requestSettings.setLinearPlaybackPositions(midrollCuePoints);

            return Pulse.createSession(
              contentMetadata,
              requestSettings);
          }

          @Override
          public void onOpenClickthrough(@NonNull PulseVideoAd ad) {
            Intent intent = new Intent(Intent.ACTION_VIEW)
              .setData(Uri.parse(ad.getClickthroughURL().toString()));
            videoView.getContext().startActivity(intent);
            ad.adClickThroughTriggered();
          }
      });

      Catalog catalog = new Catalog.Builder(eventEmitter, "YourAccountId")
          .setPolicy("YourPolicyKey")
          .build();
      catalog.findVideoByID("YourVideoId", new VideoListener() {

        // Add the video found to the queue with add().
        // Start playback of the video with start().
        @Override
        public void onVideo(Video video) {
          videoView.add(video);
          videoView.start();
        }
      });
    }
  }

配置

這是示例佈局代碼的示例R.layout.pulse_ad_view

<?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent">

      <RelativeLayout
          android:id="@+id/view_ad_details"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:background="@drawable/pulse_skip_button_background_selector">

          <TextView
              android:id="@+id/pulse_ad_name_view"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentTop="true"
              android:layout_marginTop="4dp"
              android:paddingTop="4dp"
              android:paddingStart="8dp"
              android:paddingEnd="8dp"
              android:textColor="@color/white"
              android:background="@color/bmc_live"
              android:textStyle="bold"
              tools:text="Preroll blue"/>

          <TextView
              android:id="@+id/pulse_ad_number_view"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:paddingStart="8dp"
              android:paddingEnd="4dp"
              android:paddingBottom="4dp"
              android:layout_marginBottom="8dp"
              android:layout_below="@id/pulse_ad_name_view"
              android:textColor="@color/white"
              android:background="@color/white_semi_trans"
              tools:text="Ad (1 of 2)"/>

          <TextView
              android:id="@+id/pulse_ad_countdown_view"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:paddingStart="4dp"
              android:paddingEnd="4dp"
              android:paddingBottom="4dp"
              android:layout_marginBottom="4dp"
              android:layout_below="@id/pulse_ad_name_view"
              android:layout_toEndOf="@+id/pulse_ad_number_view"
              android:textColor="@color/green_almost_opaque"
              android:text=""
              tools:text="00:06"/>

          <TextView
              android:id="@+id/pulse_ad_learn_more_view"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_marginStart="@dimen/pulse_ad_learn_more_margin_left"
              android:layout_marginTop="@dimen/pulse_ad_learn_more_margin_top"
              android:layout_marginEnd="@dimen/pulse_ad_learn_more_margin_right"
              android:layout_marginBottom="@dimen/pulse_ad_learn_more_margin_bottom"
              android:layout_alignTop="@id/pulse_ad_name_view"
              android:layout_alignBottom="@id/pulse_ad_countdown_view"
              android:layout_alignParentEnd="true"
              android:background="@drawable/pulse_learn_more_button_background"
              android:paddingStart="12dp"
              android:paddingEnd="12dp"
              android:padding="@dimen/pulse_ad_learn_more_padding_default"
              android:gravity="center"
              android:shadowColor="@color/brightcove_semitransparent"
              android:shadowDx="-1"
              android:shadowDy="1"
              android:shadowRadius="1.5"
              android:text="@string/pulse_message_learn_more"
              android:textColor="@color/pulse_button_text_color"
              android:nextFocusUp="@id/pulse_skip_ad_view"
              android:textSize="@dimen/pulse_message_text_size"
              android:visibility="gone"
              tools:visibility="visible" />

      </RelativeLayout>

      <TextView
          android:id="@+id/pulse_skip_ad_view"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:maxWidth="164dp"
          android:layout_alignParentEnd="true"
          android:layout_centerVertical="true"
          android:layout_marginBottom="@dimen/pulse_skip_ad_margin_bottom"
          android:background="@drawable/pulse_skip_button_background_selector"
          android:ellipsize="none"
          android:gravity="center"
          android:maxLines="2"
          android:paddingStart="@dimen/pulse_skip_ad_padding_left"
          android:paddingEnd="@dimen/pulse_skip_ad_padding_right"
          android:paddingTop="@dimen/pulse_skip_ad_padding"
          android:paddingBottom="@dimen/pulse_skip_ad_padding"
          android:scrollHorizontally="false"
          android:shadowColor="@color/brightcove_shadow"
          android:shadowDx="-1"
          android:shadowDy="1"
          android:shadowRadius="1.5"
          android:text="@string/pulse_message_skip_ad"
          android:textColor="@color/pulse_button_text_color"
          android:textSize="@dimen/pulse_message_text_size"
          android:visibility="gone"
          android:nextFocusUp="@id/pulse_ad_learn_more_view"
          android:focusable="true"
          tools:visibility="visible"/>

  </RelativeLayout>