Chrome 66 umożliwia stronom internetowym korzystanie z dodatkowego podłączonego wyświetlacza przez Interfejs API Prezentacji i kontrolować jego zawartość za pomocą Prezentacji Interfejs Receiver API.
. .Tło
Do tej pory programiści mogli tworzyć rozwiązania, które pozwalały użytkownikowi zobaczyć treści w Chrome różniące się od tych, które można zobaczyć na pilocie. a jednocześnie nadal mieć możliwość sterowania nim lokalnie. Przykłady zarządzanie kolejką odtwarzania na youtube.com podczas odtwarzania filmów na telewizorze, lub obejrzenie na laptopie podsumowania slajdów z notatkami jest wyświetlana w sesji na spotkaniu.
Istnieją sytuacje, w których użytkownicy mogą po prostu chcieć zaprezentować treści i dołączony wyświetlacz. Wyobraź sobie na przykład użytkownika w sali konferencyjnej. z projektorem, do którego są podłączone kablem HDMI. Zamiast powielać prezentację w zdalnym punkcie końcowym, użytkownik może ale chce wyświetlić slajdy na pełnym ekranie projektora. ekran laptopa dla notatek prelegenta i sterowania slajdami. Chociaż witryna popierałby to w bardzo praktyczny sposób (np. przez wygłaszanie nowych które użytkownik musi ręcznie przeciągnąć na dodatkowy wyświetlacz. do pełnego ekranu), jest to niewygodne i powoduje niespójności między prezentacjami lokalnymi i zdalnymi.
Prezentowanie strony
Omówię teraz sposób używania interfejsu Presentation API do prezentowania strony internetowej na dodatkowym podłączonym ekranie. Efekt końcowy jest dostępny na https://googlechrome.github.io/samples/presentation-api/.
Najpierw utworzymy nowy obiekt PresentationRequest
, który będzie zawierał
Adres URL, który chcemy pokazywać na dodatkowym podłączonym ekranie.
const presentationRequest = new PresentationRequest('receiver.html');
In this article, I won’t cover use cases where the parameter passed to
`PresentationRequest` can be an array like `['cast://foo’, 'apple://foo',
'https://example.com']` as this is not relevant there.
We can now monitor presentation display availability and toggle a "Present"
button visibility based on presentation displays availability. Note that we can
also decide to always show this button.
<aside class="caution"><b>Caution:</b> The browser may use more energy while the <code>availability</code> object is alive
and actively listening for presentation display availability changes. Please
use it with caution in order to save energy on mobile.</aside>
```js
presentationRequest.getAvailability()
.then(availability => {
console.log('Available presentation displays: ' + availability.value);
availability.addEventListener('change', function() {
console.log('> Available presentation displays: ' + availability.value);
});
})
.catch(error => {
console.log('Presentation availability not supported, ' + error.name + ': ' +
error.message);
});
Aby wyświetlić prompt w widoku prezentacji, użytkownik musi wykonać gest, np. kliknąć
na przycisku. Wywołajmy więc presentationRequest.start()
jednym kliknięciem i
Poczekaj, aż użytkownik wybierze prezentację, aż obietnica się zakończy
do wyświetlania (np. drugiego podłączonego ekranu w naszym przypadku użycia).
function onPresentButtonClick() {
presentationRequest.start()
.then(connection => {
console.log('Connected to ' + connection.url + ', id: ' + connection.id);
})
.catch(error => {
console.log(error);
});
}
Lista prezentowana użytkownikowi może też zawierać zdalne punkty końcowe, takie jak Chromecastach, jeśli masz połączenie z siecią reklamującą te urządzenia. Pamiętaj, że wyświetlaczy lustrzanych nie ma na tej liście. Zobacz http://crbug.com/840466.
Po spełnieniu obietnicy strona internetowa pod adresem URL obiektu PresentationRequest
zostanie
prezentowane na wybranym wyświetlaczu. I gotowe!
Możemy teraz pójść o krok dalej i monitorować „zamknięcie”. i „zakończyć” wyświetlane zdarzenia
poniżej. Pamiętaj, że możesz ponownie połączyć się z „zamkniętym” kontem.
presentationConnection
– presentationRequest.reconnect(presentationId)
gdzie presentationId
to identyfikator poprzedniego obiektu presentationRequest
.
function onCloseButtonClick() {
// Disconnect presentation connection but will allow reconnection.
presentationConnection.close();
}
presentationConnection.addEventListener('close', function() {
console.log('Connection closed.');
});
function onTerminateButtonClick() {
// Stop presentation connection for good.
presentationConnection.terminate();
}
presentationConnection.addEventListener('terminate', function() {
console.log('Connection terminated.');
});
Komunikacja ze stroną
Jak można przesyłać wiadomości między
stronie kontrolera (tej, którą właśnie utworzyliśmy) i stronie odbiornika (tej
przekazane do obiektu PresentationRequest
)?
Najpierw pobierzmy istniejące połączenia na stronie odbiorcy za pomocą
navigator.presentation.receiver.connectionList
i odsłuchaj przychodzące
połączeń, jak pokazano poniżej.
// Receiver page
navigator.presentation.receiver.connectionList
.then(list => {
list.connections.map(connection => addConnection(connection));
list.addEventListener('connectionavailable', function(event) {
addConnection(event.connection);
});
});
function addConnection(connection) {
connection.addEventListener('message', function(event) {
console.log('Message: ' + event.data);
connection.send('Hey controller! I just received a message.');
});
connection.addEventListener('close', function(event) {
console.log('Connection closed!', event.reason);
});
}
Połączenie odbierające wiadomość uruchamia „wiadomość” które możesz nasłuchiwać.
Wiadomość może być ciągiem znaków, obiektem Blob, SlateBuffer lub ArrayBufferView.
Aby wysłać wiadomość, wystarczy wywołać funkcję connection.send(message)
z
stronie kontrolera lub odbiornika.
// Controller page
function onSendMessageButtonClick() {
presentationConnection.send('Hello!');
}
presentationConnection.addEventListener('message', function(event) {
console.log('I just received ' + event.data + ' from the receiver.');
});
Przetestuj sampel na stronie https://googlechrome.github.io/samples/presentation-api/, aby dowiedzieć się więcej jak to działa. Na pewno spodoba Ci się tak jak mi.
Sample i wersje demonstracyjne
Zobacz oficjalną próbkę Chrome, której użyliśmy w tym artykule.
Zalecamy też prezentację interaktywnej ściany Photowall. Ta aplikacja internetowa zezwala wielu kontrolerów, aby móc wspólnie wyświetlać pokaz slajdów ze zdjęć widok prezentacji. Kod jest dostępny na https://github.com/GoogleChromeLabs/presentation-api-samples.
.Jeszcze jedno
Chrome ma funkcję przesyłania które użytkownicy mogą wywołać w dowolnym momencie, odwiedzając
witryny. Jeśli chcesz sterować domyślną prezentacją w tym menu,
przypisz element navigator.presentation.defaultRequest
do niestandardowej
Obiekt presentationRequest
został utworzony wcześniej.
// Make this presentation the default one when using the "Cast" browser menu.
navigator.presentation.defaultRequest = presentationRequest;
Wskazówki dla programistów
Aby sprawdzić stronę odbiornika i ją zdebugować, otwórz
chrome://inspect
, wybierz „Inne” i kliknij link „Sprawdź” obok
obecnie prezentowanego adresu URL.
Zapoznaj się też z wewnętrznym chrome://media-router-internals
zawiera szczegółowe informacje o wewnętrznych procesach wykrywania i dostępności.
Co dalej?
Od wersji Chrome 66 obsługiwane są platformy ChromeOS, Linux i Windows. Mac pomoc będzie dostępna później.
Zasoby
- Stan funkcji Chrome: https://www.chromestatus.com/features#presentation%20api
- Błędy implementacji: https://crbug.com/?q=component:Blink>PresentationAPI
- Specyfikacja interfejsu Presentation API: https://w3c.github.io/presentation-api/
- Problemy ze specyfikacją: https://github.com/w3c/presentation-api/issues