Wyjaśnienie obiegu pracy chronionych treściFlash Player 10.1 i nowsze wersje, Adobe AIR 2.0 i nowsze wersje Na przykładzie poniższego obiegu pracy wysokiego poziomu przedstawiono, jak aplikacja może pobierać i odtwarzać chronione treści. W tym obiegu pracy przyjęto, że aplikacja jest zaprogramowana konkretnie do odtwarzania treści chronionych przez Flash Access:
Jeśli nie wystąpił błąd i pomyślnie zweryfikowano uprawnienia użytkownika do wyświetlenia treści, obiekt NetStream wywołuje obiekt DRMStatusEvent. Aplikacja rozpoczyna wówczas odtwarzanie. Obiekt DRMStatusEvent zawiera pokrewne informacje z kuponu, które identyfikują zasady i uprawnienia użytkownika. Zawiera on, na przykład, informacje o tym, czy treści można udostępniać offline lub o tym, kiedy kończy się ważność licencji. Aplikacja na podstawie tych danych może poinformować użytkownika o obowiązujących go zasadach. Na przykład aplikacja może na pasku stanu wyświetlić pozostałą liczbę dni, przez jaką użytkownik będzie jeszcze mieć uprawnienia do wyświetlania treści. (Dotyczy tylko AIR) Jeżeli użytkownikowi przyznano dostęp w trybie offline, kupon zostanie zapisany w pamięci podręcznej, a zaszyfrowane treści zostaną pobrane do komputera użytkownika. Treści są udostępniane na czas określony przez okres wypożyczenia do użytkowania offline. Właściwość detail obiektu zdarzenia zawiera tekst „DRM.voucherObtained". Aplikacja decyduje o miejscu lokalnego przechowywania treści udostępnianej w trybie offline. Można także wstępnie załadować kupony, korzystając z klasy DRMManager. Wszystkie błędy związane z DRM powodują wywołanie przez aplikację obiektu zdarzenia DRMErrorEvent lub, w przypadku środowiska AIR, obiektu DRMAuthenticationErrorEvent. Do aplikacji należy jawne obsługiwanie wszelkich innych zdarzeń błędów. Dotyczy to przypadków, w których użytkownik wprowadza poprawne poświadczenia, ale kupon chroniący zaszyfrowaną treść ogranicza dostęp do niej. Na przykład, uwierzytelniony użytkownik nie może uzyskać dostępu do treści, jeżeli nie uiszczono opłaty za uprawnienia do korzystania z nich. Taka sytuacja może również wystąpić, gdy dwóch zarejestrowanych abonentów tego samego wydawcy próbuje udostępnić treść, za którą zapłacił tylko jeden z nich. Aplikacja powinna poinformować użytkownika o błędzie i zaproponować alternatywne rozwiązanie. Typowym alternatywnym rozwiązaniem jest wyświetlenie instrukcji rejestracji i opłacenia praw do wyświetlania. Szczegółowy obieg pracy APIW tym obiegu pracy przedstawiono bardziej szczegółowy widok obiegu pracy treści chronionych. W tym obiegu pracy opisano konkretne interfejsy API wykorzystywane do odtwarzania treści chronionych przez moduł Flash Access.
Zdarzenia powiązane z mechanizmem DRMŚrodowisko wykonawcze wywołuje wiele zdarzeń, gdy aplikacja podejmuje próbę odtworzenia chronionych treści:
W celu obsługi treści chronionych przez Flash Access dodaj detektory zdarzeń do obsługi zdarzeń mechanizmu DRM. Wstępne ładowanie kuponów w celu odtwarzania bez połączeniaMożliwe jest wstępne załadowanie kuponów (licencji) wymaganych do odtwarzania treści chronionych przez Flash Access. Wstępnie załadowane kupony umożliwiają użytkownikom wyświetlanie treści niezależnie do tego, czy w danej chwili mają aktywne połączenie z Internetem. (Do samego wstępnego załadowania kuponu połączenie z Internetem jest wymagane). Do wstępnego ładowania kuponów służy metoda preloadEmbeddedMetadata() klasy NetStream oraz klasa DRMManager środowiska. W wersji środowiska AIR 2.0 i nowszych można użyć obiektu DRMContentData do bezpośredniego wstępnego załadowania kuponów. Jest to preferowana technika, gdyż umożliwia zaktualizowanie obiektu DRMContentData niezależnie od treści. (Metoda preloadEmbeddedData() pobiera obiekt DRMContentData z treści.) Korzystanie z obiektu DRMContentDataW poniższej procedurze przedstawiono obieg pracy wstępnego ładowania kuponu dla chronionego pliku multimedialnego z wykorzystaniem obiektu DRMContentData.
Korzystanie z obiektu preloadEmbeddedMetadata()Poniżej przedstawiono kolejne etapy procedury wstępnego ładowania kuponu dla pliku multimedialnego chronionego mechanizmem DRM z wykorzystaniem obiektu preloadEmbeddedMetadata():
Poniższy przykładowy kod dla środowiska AIR ilustruje sposób wstępnego ładowania kuponu dla lokalnego pliku multimedialnego: package
{
import flash.display.Sprite;
import flash.events.DRMAuthenticationCompleteEvent;
import flash.events.DRMAuthenticationErrorEvent;
import flash.events.DRMErrorEvent;
import flash.ev ents.DRMStatusEvent;
import flash.events.NetStatusEvent;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.net.NetStreamPlayOptions;
import flash.net.drm.AuthenticationMethod;
import flash.net.drm.DRMContentData;
import flash.net.drm.DRMManager;
import flash.net.drm.LoadVoucherSetting;
public class DRMPreloader extends Sprite
{
private var videoURL:String = "app-storage:/video.flv";
private var userName:String = "user";
private var password:String = "password";
private var preloadConnection:NetConnection;
private var preloadStream:NetStream;
private var drmManager:DRMManager = DRMManager.getDRMManager();
private var drmContentData:DRMContentData;
public function DRMPreloader():void {
drmManager.addEventListener(
DRMAuthenticationCompleteEvent.AUTHENTICATION_COMPLETE,
onAuthenticationComplete);
drmManager.addEventListener(DRMAuthenticationErrorEvent.AUTHENTICATION_ERROR,
onAuthenticationError);
drmManager.addEventListener(DRMStatusEvent.DRM_STATUS, onDRMStatus);
drmManager.addEventListener(DRMErrorEvent.DRM_ERROR, onDRMError);
preloadConnection = new NetConnection();
preloadConnection.addEventListener(NetStatusEvent.NET_STATUS, onConnect);
preloadConnection.connect(null);
}
private function onConnect( event:NetStatusEvent ):void
{
preloadMetadata();
}
private function preloadMetadata():void
{
preloadStream = new NetStream( preloadConnection );
preloadStream.client = this;
var options:NetStreamPlayOptions = new NetStreamPlayOptions();
options.streamName = videoURL;
preloadStream.preloadEmbeddedData( options );
}
public function onDRMContentData( drmMetadata:DRMContentData ):void
{
drmContentData = drmMetadata;
if ( drmMetadata.authenticationMethod == AuthenticationMethod.USERNAME_AND_PASSWORD )
{
authenticateUser();
}
else
{
getVoucher();
}
}
private function getVoucher():void
{
drmManager.loadVoucher( drmContentData, LoadVoucherSetting.ALLOW_SERVER );
}
private function authenticateUser():void
{
drmManager.authenticate( drmContentData.serverURL, drmContentData.domain, userName, password );
}
private function onAuthenticationError( event:DRMAuthenticationErrorEvent ):void
{
trace( "Authentication error: " + event.errorID + ", " + event.subErrorID );
}
private function onAuthenticationComplete( event:DRMAuthenticationCompleteEvent ):void
{
trace( "Authenticated to: " + event.serverURL + ", domain: " + event.domain );
getVoucher();
}
private function onDRMStatus( event:DRMStatusEvent ):void
{
trace( "DRM Status: " + event.detail);
trace("--Voucher allows offline playback = " + event.isAvailableOffline );
trace("--Voucher already cached = " + event.isLocal );
trace("--Voucher required authentication = " + !event.isAnonymous );
}
private function onDRMError( event:DRMErrorEvent ):void
{
trace( "DRM error event: " + event.errorID + ", " + event.subErrorID + ", " + event.text );
}
public function onPlayStatus( info:Object ):void
{
preloadStream.close();
}
}
}
|
|