title: Flicker with StageVideo on Android tablet?
body: <p>I have a stageVideo class that I use it play a video on a tablet but every time I play a video the tablet screen flickers a few times (goes black then comes out of it about four or so times) I am wondering what could be causing this. It does this while I switch to the view with the video playing. The url of the video is passed to the video mxml view. I am using flex 4.6 and Android tablet (EEE transformer prime). </p>
  
  <pre><code>package ios 
  {     
  import flash.display.Sprite; 
  import flash.display.StageAlign; 
  import flash.display.StageQuality; 
  import flash.display.StageScaleMode; 
  import flash.events.Event; 
  import flash.events.NetStatusEvent; 
  import flash.events.StageVideoAvailabilityEvent; 
  import flash.events.StageVideoEvent; 
  import flash.geom.Rectangle; 
  import flash.media.StageVideo; 
  import flash.media.StageVideoAvailability; 
  import flash.media.Video; 
  import flash.net.NetConnection; 
  import flash.net.NetStream; 
  
  
  [Bindable] 
  public class iOSStageVideo extends Sprite 
  { 
      private var videoPath:String; 
      private var videoWidth:Number; 
      private var videoHeight:Number; 
      private var _sv:StageVideo; 
      private var _vd:Video; 
      private var _obj:Object; 
      private var _ns:NetStream; 
  
      public function iOSStageVideo( path:String , w:Number , h:Number ):void
      { 
          videoPath = path; 
          videoWidth = w; 
          videoHeight = h; 
          addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
      } 
  
      //stage is ready 
      private function onAddedToStage(e:Event):void
      { 
          stage.scaleMode = StageScaleMode.NO_SCALE; 
          stage.align = StageAlign.TOP_LEFT; 
  
          var nc:NetConnection = new NetConnection(); 
          nc.connect(null); 
  
          _ns =  new NetStream(nc); 
          _obj = new Object(); 
  
          _ns.client = _obj; _ns.bufferTime = 2; 
          _ns.client = _obj; 
  
          _obj.onMetaData = MetaData; 
  
          _sv = stage.stageVideos[0]; 
          _sv.viewPort = new Rectangle(0, 42, videoWidth , videoHeight ); 
          _sv.attachNetStream(_ns); 
  
          playVideo(); 
      } 
  
  
      //video is ready, play it 
      //public, can be called externally 
      public function playVideo():void{ 
          _ns.play( videoPath ); 
          _ns.addEventListener(NetStatusEvent.NET_STATUS, videoStatus); 
      } 
  
  
  
      //required metadata for stagevideo, even if not used 
      private function MetaData(info:Object):void{ } 
  
      //get video status 
      private function videoStatus(e:NetStatusEvent):void{ 
  
          switch(e.info.code){ 
              case "NetStream.Play.StreamNotFound": 
                  //do something 
                  break; 
              case "NetStream.Play.Start": 
                  //do something 
                  break 
              case "NetStream.Play.Stop": 
                  //do something
                  trace('the video has ended');
                  stopVideo();
                  break; 
              case "NetStream.Buffer.Empty": 
                  //do something 
                  break; 
              case "NetStream.Buffer.Full": 
                  //do something 
  
                  break; 
              case "NetStream.Buffer.Flush": 
                  //do something 
                  break; 
              case "NetStream.Play.Complete":
                  //do something 
                  break;
          } 
      } 
  
      //stop and clear the video 
      //public, can be called externally 
      public function stopVideo():void{  
          trace("StopVideo is ran.");
          _ns.close();
          _ns.dispose(); 
          dispatchEvent( new Event('videoDone', true ) ); 
  
      } 
  
      public function stopVideoBack():void {
          _ns.close();
          _ns.dispose(); 
      }
  } 
  </code></pre>
  
  <p>}</p>
  
  <p>Here is my code for the view that plays the video when the video is completed </p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" title="" backgroundAlpha="0" creationComplete="init(event)" addedToStage="onAddedToStage(event)"  &gt;
  
  &lt;fx:Script&gt;
      &lt;![CDATA[
  
          import ios.iOSStageVideo;
          import mx.core.UIComponent;
          import mx.events.FlexEvent;
  
  
  
          protected var path:String = new String(""); 
          protected var backPage:String = new String("");
          protected var vid:iOSStageVideo = new iOSStageVideo( path , 1280 , 720 );
          private var arr:Array;
          //protected var vid:iOSStageVideo; 
          protected var container:UIComponent = new UIComponent(); 
  
          protected function init(event:FlexEvent):void
          {
              // Sets up the back button to back to the right slide
              arr =  data as Array;
              trace(data);
              path = String(arr[0]);
              backPage = String(arr[1]) 
  
              //creates the video
              vid = new iOSStageVideo( path , 1280 , 720 );
              loadVideo();
  
              //takes out the trash when the back button is hit so the stage video is ready when the new view is loaded
              stage.addEventListener("keyDown", handleButtons, false,1);
              stage.addEventListener("keyUp", handleButtons, false, 1);
          }
  
          override public function createReturnObject():Object {
              var returnedObject:Object = new Object();
              returnedObject.myValue = arr[2];
              trace("arr[2] -&gt;" + arr[2])
              return returnedObject;
          }
  
  
          protected function loadVideo():void
          {
              //loades the video
              vid.addEventListener('videoDone' , videoStop); 
              container.width = stage.stageWidth; 
              container.height = stage.stageHeight; 
  
              addElement( container ); 
              container.addChild( vid ); 
  
          }
  
          protected function playVideo(event:MouseEvent):void
          {
              vid.playVideo();
          }
  
          private function videoStop(e:Event):void {
                  //removes container
                  container.removeChild( vid ); 
                  removeElement( container ); 
                  navigator.popView();
          }
  
          private function removeEverything():void {
              vid.stopVideoBack();
              try
              {
                  container.removeChild( vid ); 
                  removeElement( container );
              } 
              catch(error:Error) 
              {
                  trace("error with container");
              }
          }
  
          protected function onAddedToStage(event:Event):void
          {               
              if (stage.autoOrients) {
                  stage.removeEventListener(StageOrientationEvent.ORIENTATION_CHANGING, orientationChanging);
                  stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGING, orientationChanging, false, 100, true);
              }
          }
  
          private function orientationChanging(event:StageOrientationEvent):void {
              event.stopImmediatePropagation();
              if (event.afterOrientation == StageOrientation.ROTATED_LEFT  || event.afterOrientation == StageOrientation.ROTATED_RIGHT) {
                  event.preventDefault(); 
              }   
          }
  
          protected function handleButtons(event:KeyboardEvent):void
          {
              if (event.keyCode == Keyboard.HOME) {
                  // Handle Home button.
              }
              else if (event.keyCode == Keyboard.BACK) {
                  // Hanlde back button.
                  removeEverything();
              }
          }
  
      ]]&gt;
  &lt;/fx:Script&gt;
  &lt;fx:Declarations&gt;
      &lt;!-- Place non-visual elements (e.g., services, value objects) here --&gt;
  &lt;/fx:Declarations&gt;
  &lt;/s:View&gt;
  </code></pre>
  
  <p>Compiler arguments</p>
  
  <pre><code>-locale en_US
  -swf-version=13 
  -target-player=11.0
  -define CONFIG::LOGGING false 
  -define CONFIG::FLASH_10_1 true
  </code></pre>
  
  <p><em>Added</em> Updated to code to have a StageVideoEvent listener and simplified to one view (also to know the renderMode is set to direct)</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" title="video" backgroundAlpha="0" creationComplete="init(event)" &gt;
  &lt;fx:Script&gt;
      &lt;![CDATA[
          import mx.core.UIComponent;
  
          protected var videoPath:String = new String("video.mp4"); 
          private var videoWidth:Number = 1280;
          private var videoHeight:Number = 680; 
  
          private var stageVideoAvail:Boolean;
          private var sv:StageVideo;
  
          private function init(e:Event):void {
              trace("ran one");
              onAddedToStage(); 
          }
  
          private function onAddedToStage():void {
              trace('test');
              stage.scaleMode = StageScaleMode.NO_SCALE;
              stage.align = StageAlign.TOP_LEFT; 
  
  
                 stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onStageVideoAvailability);
  
          }
  
          private function onStageVideoAvailability( e : StageVideoAvailabilityEvent ) : void
          {
              if (e.availability == StageVideoAvailability.AVAILABLE){
                  stageVideoAvail = true;
                  initVideo();
              } else {
                  stageVideoAvail = false;
              }
          }
  
          private function initVideo():void
          {
              var obj:Object = new Object();
              var nc:NetConnection = new NetConnection();
              nc.connect(null);
              var ns:NetStream = new NetStream(nc);
              ns.client = obj;
  
              if(stageVideoAvail)
              {
                  sv = stage.stageVideos[0];
                  sv.addEventListener(StageVideoEvent.RENDER_STATE, onRender);
                  sv.attachNetStream(ns);
                  trace('available');
              }
              else
              {
                  var vid:Video = new Video(videoWidth, 768);
                  addChild(vid);
                  vid.attachNetStream(ns);
                  trace('not');
              }
  
              ns.play( videoPath );
          }
  
          private function onRender(e:StageVideoEvent):void
          {
              sv.viewPort = new Rectangle(0, 0, videoWidth, 768);
          }
  
          public function onMetaData(e:Object):void
          {
  
          }
  
          public function onXMPData(e:Object):void
          {
  
          }
  
      ]]&gt;
  &lt;/fx:Script&gt;
  &lt;fx:Declarations&gt;
      &lt;!-- Place non-visual elements (e.g., services, value objects) here --&gt;
  &lt;/fx:Declarations&gt;
  &lt;/s:View&gt;
  </code></pre>
  
  <p>The only other view in this application just has a button with navigator.pushView(Copyofvideo,null,null); and when ever the button is clicked the screen flickers and then it video plays.</p>