Compartir a través de


Administrar la difusión de juegos

En este artículo se muestra cómo administrar la difusión de juegos para una aplicación para UWP. Los usuarios deben iniciar la difusión mediante la interfaz de usuario del sistema integrada en Windows, pero a partir de Windows 10, versión 1709, las aplicaciones pueden iniciar la interfaz de usuario de difusión del sistema y pueden recibir notificaciones cuando se inicia y detiene la difusión.

Agregar las extensiones de escritorio de Windows para UWP a la aplicación

Las API para administrar la difusión de aplicaciones, que se encuentran en el espacio de nombres Windows.Media.AppBroadcasting , no se incluyen en el contrato de API universal. Para acceder a las API, debes agregar una referencia a las extensiones de escritorio de Windows para UWP a la aplicación con los pasos siguientes.

  1. En Visual Studio, en Explorador de soluciones, expanda el proyecto de UWP y haga clic con el botón derecho en Referencias y, a continuación, seleccione Agregar referencia....
  2. Expanda el nodo Universal Windows y seleccione Extensiones.
  3. En la lista de extensiones, active la casilla situada junto a las Extensiones de escritorio de Windows para la entrada de UWP que coincida con la compilación de destino del proyecto. Para las características de difusión de la aplicación, la versión debe ser 1709 o superior.
  4. Haga clic en OK.

Iniciar la interfaz de usuario del sistema para permitir al usuario iniciar la difusión

Hay varias razones por las que es posible que la aplicación no pueda difundir actualmente, incluso si el dispositivo actual no cumple los requisitos de hardware para la difusión o si otra aplicación está transmitiendo actualmente. Antes de iniciar la interfaz de usuario del sistema, puedes comprobar si la aplicación es capaz de difundir. En primer lugar, compruebe si las API de difusión están disponibles en el dispositivo actual. Las API no están disponibles en los dispositivos que ejecutan una versión del sistema operativo anterior a Windows 10, versión 1709. En lugar de comprobar si hay una versión específica del sistema operativo, use el método ApiInformation.IsApiContractPresent para consultar la versión 1.0 de Windows.Media.AppBroadcasting.AppBroadcastingContract. Si este contrato está presente, las API de difusión están disponibles en el dispositivo.

A continuación, obtenga una instancia de la clase AppBroadcastingUI llamando al método de fábrica GetDefault en pc, donde hay un único usuario que inició sesión cada vez. En Xbox, donde varios usuarios pueden iniciar sesión, llame a GetForUser en su lugar. A continuación, llame a GetStatus para obtener el estado de difusión de la aplicación.

La propiedad CanStartBroadcast de la clase AppBroadcastingStatus indica si la aplicación puede iniciar la difusión actualmente. Si no es así, puede comprobar la propiedad Details para determinar el motivo por el que la difusión no está disponible. Según el motivo, es posible que desee mostrar el estado al usuario o mostrar instrucciones para habilitar la difusión.

// Verify that the edition supports the AppBroadcasting APIs
if (!Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent(
    "Windows.Media.AppBroadcasting.AppBroadcastingContract", 1, 0))
{
    return;
}

// On PC, call GetDefault because there is a single user signed in.
// On Xbox, call GetForUser instead because multiple users can be signed in.
AppBroadcastingUI^ broadcastingUI = AppBroadcastingUI::GetDefault();
AppBroadcastingStatus^ broadcastingStatus = broadcastingUI->GetStatus();

if (!broadcastingStatus->CanStartBroadcast)
{
    AppBroadcastingStatusDetails^ details = broadcastingStatus->Details;

    if (details->IsAnyAppBroadcasting)
    {
        UpdateStatusText("Another app is currently broadcasting.");
        return;
    }

    if (details->IsCaptureResourceUnavailable)
    {
        UpdateStatusText("The capture resource is currently unavailable.");
        return;
    }

    if (details->IsGameStreamInProgress)
    {
        UpdateStatusText("A game stream is currently in progress.");
        return;
    }

    if (details->IsGpuConstrained)
    {
        // Typically, this means that the GPU software does not include an H264 encoder
        UpdateStatusText("The GPU does not support broadcasting.");
        return;
    }

    // Broadcasting can only be started when the application's window is the active window.
    if (details->IsAppInactive)
    {
        UpdateStatusText("The app window to be broadcast is not active.");
        return;
    }

    if (details->IsBlockedForApp)
    {
        UpdateStatusText("Broadcasting is blocked for this app.");
        return;
    }

    if (details->IsDisabledByUser)
    {
        UpdateStatusText("The user has disabled GameBar in Windows Settings.");
        return;
    }

    if (details->IsDisabledBySystem)
    {
        UpdateStatusText("Broadcasting is disabled by the system.");
        return;
    }
    return;
}

Solicite que el sistema muestre la interfaz de usuario de difusión de la aplicación mediante una llamada a ShowBroadcastUI.

Nota:

El método ShowBroadcastUI representa una solicitud que puede no realizarse correctamente, en función del estado actual del sistema. La aplicación no debe suponer que la difusión ha comenzado después de llamar a este método. Use el evento IsCurrentAppBroadcastingChanged para recibir una notificación cuando se inicie o detenga la difusión.

broadcastingUI->ShowBroadcastUI();

Recibir notificaciones cuando se inicia y detiene la difusión

Regístrese para recibir notificaciones cuando el usuario use la interfaz de usuario del sistema para iniciar o detener la difusión de la aplicación inicializando una instancia de la clase AppBroadcastingMonitor y registrando un controlador para el evento IsCurrentAppBroadcastingChanged. Como se explicó en la sección anterior, asegúrese de usar ApiInformation.IsApiContractPresent en algún momento para comprobar que las API de difusión están presentes en el dispositivo antes de intentar usarlas.

if (Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent(
    "Windows.Media.AppBroadcasting.AppBroadcastingContract", 1, 0))
{
    m_appBroadcastMonitor = ref new AppBroadcastingMonitor();

    m_appBroadcastMonitor->IsCurrentAppBroadcastingChanged +=
        ref new TypedEventHandler<AppBroadcastingMonitor^, Platform::Object^>(this, &App::OnIsCurrentAppBroadcastingChanged);
}

En el controlador del evento IsCurrentAppBroadcastingChanged , es posible que quieras actualizar la interfaz de usuario de la aplicación para reflejar el estado de difusión actual.

void App::OnIsCurrentAppBroadcastingChanged(AppBroadcastingMonitor^ sender, Platform::Object^ args)
{
    if (sender->IsCurrentAppBroadcasting)
    {
        UpdateStatusText("App started broadcasting.");
    }
    else
    {
        UpdateStatusText("App stopped broadcasting.");
    }
}