Uso del complemento Pulse con Native SDK para Android

En este tema, aprenderá a utilizar el complemento Pulse con el SDK nativo de Brightcove para Android.

Introducción

El complemento Pulse de Brightcove le permite integrar el SDK Pulse de Invidi con el SDK nativo de Brightcove para Android. Pulse es una plataforma de publicidad en video. Para obtener información sobre las campañas y la configuración, consulte su Guía del usuario.

Pasos

Una vez que se crea una campaña en la plataforma Pulse, puede comenzar a utilizar Pulse Plugin para Brightcove Native SDK para Android. Siga estos pasos para integrar Pulse Plugin con su proyecto:

  1. En tu módulo build.gradle archivo, agregue la dependencia del complemento Pulse.

    dependencies {
        implementation 'com.brightcove.player:android-pulse-plugin:6.12.0'
    }
  2. Descargar el Archivo .aar de Pulse SDK.

  3. En tus app / libs carpeta, abra la build.gradle archivo de su módulo. Modifique lo siguiente:

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
    }
  4. En tus MainActivity.java archivo, inicialice el complemento Pulse creando una instancia PulseComponent con la URL de host Pulse creada para su campaña.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        // Creating pulse component
        PulseComponent pulseComponent = new PulseComponent(
                "your pulse host url",
                brightcoveVideoView.getEventEmitter(),
                brightcoveVideoView);
        // ...
    }
  5. Selecciona el PulseComponent Oyente.

    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. Implementar el onCreatePulseSession método, que crea un PulseSession y lo devuelve al PulseComponent. Hay tres parámetros:

    • El anfitrión del pulso
    • La configuración de metadatos de contenido
    • La configuración de la solicitud

    @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. Implementar el onOpenClickthrough método, que se llama cuando el aprende más se hace clic en el botón de un anuncio lineal. Una acción típica para esta devolución de llamada es abrir el navegador con la URL esperada.

    @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. Reproduce tu contenido

    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();
      }
    });

Anuncios de pausa de pulso

Cuando la campaña Pulse tiene configurada la opción "Pausar anuncios", el complemento Pulse le mostrará al usuario cuando el contenido esté en pausa.

Manejo de errores

Todos los errores se mostrarán al desarrollador mediante el evento EventType.AD_ERROR, como se muestra a continuación:

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

Personalización de la interfaz de usuario

Internamente, el complemento Pulse infla el PulseAdView utilizando la R.layout.pulse_ad_view ID de diseño. Para un diseño diferente, puede crear un archivo de diseño con el mismo nombre y agregarlo al res / diseño directorio. Esto anula el diseño predeterminado.

Utilice los siguientes identificadores para reemplazar los valores predeterminados:

Vistas de componentes
Vistas de componentes
Índice Tipo de vista Ver ID
A Vista de texto pulse_ad_number_view
B Vista de texto pulse_ad_countdown_view
C Vista de texto pulse_ad_name_view
D Vista de texto pulse_ad_learn_more_view
mi Vista de texto pulse_skip_ad_view

Ejemplo de código completo

Aquí hay una muestra de código completa para usar el complemento Pulse con el SDK nativo para Android.

Actividad

A continuación, se muestra un ejemplo del código de actividad completo:

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();
        }
      });
    }
  }

Diseño

A continuación se muestra un ejemplo del código de diseño para 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>