2012-10-23 9 views
15

Ich arbeite derzeit an einer Android-Anwendung auf der Grundlage einer Website. Die iOS-Anwendung existiert bereits, und ich muss einige Codes für die Einheitlichkeit beachten.Iframe-Videos werden nicht in Vollbild-Modus in Android-Web-Ansicht gehen

Alles ist fast fertig, aber ich habe gerade ein interessantes Problem entdeckt: Wenn ich die Webansicht (ich habe keine Kontrolle über die angezeigte Seite) für eine Seite mit einem Iframe-Video (Youtube, Dailymotion) verwende, Ich gehe auf den ganzen Bildschirm, obwohl ich den Knopf des Players drücke.

Ich habe schon so ziemlich alles hier ausprobiert, aber es bezieht sich nur auf Apps, wo ich weiß, welche Seiten Sie anzeigen müssen.

Hier ist der Code für das webActivity Teil der App:

public class WebActivity extends Activity { 
    String targetURL = ""; 
    String title = ""; 
    WebView wv; 

    @Override 
    public void onResume() { super.onResume(); CookieSyncManager.getInstance().startSync(); } 
    @Override 
    public void onPause() { super.onPause(); CookieSyncManager.getInstance().stopSync(); } 

    /** Called when the activity is first created. */ 
    @SuppressLint("SetJavaScriptEnabled") 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getWindow().requestFeature(Window.FEATURE_PROGRESS); 
     //getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
     CookieSyncManager.createInstance(getApplicationContext()); 
     CookieSyncManager.getInstance().startSync(); 
     CookieManager.getInstance().setAcceptCookie(true); 
     /** 
     * TODO: WebView Cookie management. 
     * Right now, a cookie is hardcoded here into the WebView instead of getting it from the API called by HttpClient when retrieving the JSON. 
     * Need to make things cleaner. 
     */ 
     CookieManager.getInstance().setCookie("http://www.blabla.fr/mobile/","gbapi=1; Domain=.www.blabla.fr"); 
     /** 
     * Get parameters 
     */ 
     Bundle b = getIntent().getExtras(); 
     if(b != null) 
     { 
      targetURL = b.getString("url"); 
      title = b.getString("title"); 
     } 

     setTitle(title); 
     setContentView(R.layout.activity_webview); 

     wv = (WebView) findViewById(R.id.webview); 

     WebSettings wvSettings = wv.getSettings(); 

     // WebView options 
     wvSettings.setDefaultTextEncodingName("utf-8"); 
     wvSettings.setJavaScriptEnabled(true); 
     wvSettings.setPluginState(PluginState.ON); 
     wvSettings.setJavaScriptCanOpenWindowsAutomatically(true); 
     wvSettings.setBuiltInZoomControls(true); 
     final Activity activity = this; 
     wv.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView view, int progress) { 
       activity.setProgress(progress * 100); 
      } 
     }); 

     wv.setWebViewClient(new WebViewClient() { 
      public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
       Toast.makeText(activity, "Oh snap! " + description, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     wv.loadUrl(targetURL); 
    } 
} 

Vielen Dank für jede Hilfe.

Antwort

2

Sie müssen einen benutzerdefinierten WebChromeClient erstellen, der beide Versionen von onShowCustomView (eine neue Version dieses Rückrufs wurde in API-Ebene 14 eingeführt) sowie onHideCustomView behandelt. Im Wesentlichen wird Folgendes passieren: Wenn Sie versuchen, Videos im Vollbildmodus abzuspielen, erhalten Sie eine Ansicht, die eine Variation von VideoView darstellt. Sie müssen dies an ein Vollbild-FrameLayout anhängen und es an die Wurzel Ihrer Layout-Hierarchie kleben, um den gesamten Bildschirm zu überlagern. Sobald sie fertig sind, müssen Sie sie wieder entfernen.

Hier ist eine Version, die ich Videos abspielen bin mit

private class DerpChromeClient extends WebChromeClient implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener { 
    //@Override 
    public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) { 
     log.warn("onShowCustomView"); 
     showCustomView(view, callback); 
    } 

    private View mVideoProgressView; 

    @Override 
    public void onHideCustomView() { 
     super.onHideCustomView(); 

     activity.removeFullscreenView(); 
     webView.setVisibility(View.VISIBLE); 

     try { 
      mCustomViewCallback.onCustomViewHidden(); 
     } catch (NullPointerException npe) { 
      // occasionally Android likes to freak out and throw an unhandled NPE if it can't play the video 
      // therefore we are not going to do anything but eat this exception so it fails gracefully 
     } 

     mCustomView = null; 
     mVideoView = null; 
    } 

    @Override 
    public void onShowCustomView(View view, CustomViewCallback callback) { 
     super.onShowCustomView(view, callback); 
     log.warn("onShowCustomView"); 
     showCustomView(view, callback); 
    } 

    private void showCustomView(View view, CustomViewCallback callback) { 
     if (mCustomView != null) { 
      callback.onCustomViewHidden(); 
      return; 
     } 

     mCustomView = view; 
     mCustomViewCallback = callback; 
     webView.setVisibility(View.GONE); 

     if (view instanceof FrameLayout) { 
      if (((FrameLayout)view).getFocusedChild() instanceof VideoView) { 
       mVideoView = (VideoView)((FrameLayout)view).getFocusedChild(); 
      } 
     } 

     view.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); 
     view.setBackgroundColor(Color.BLACK); 
     activity.displayFullscreenView(view); 
    } 

    @Override 
    public boolean onConsoleMessage(ConsoleMessage cm) { 
     log.warn("Console Message: " + cm.message() + " on line " + cm.lineNumber() + " of " + cm.sourceId()); 
     return super.onConsoleMessage(cm); 
    } 

    @Override 
    public void onProgressChanged(WebView view, int newProgress) { 
     super.onProgressChanged(view, newProgress); 

     if (newProgress < 100) { 
      if (loadingProgress.getVisibility() == ProgressBar.GONE) { 
       loadingProgress.setVisibility(ProgressBar.VISIBLE); 
      } 
      loadingProgress.setProgress(newProgress); 
     } else if (newProgress >= 100) { 
      loadingProgress.setVisibility(ProgressBar.GONE); 
     } 
    } 

    @Override 
    public View getVideoLoadingProgressView() { 
     if (mVideoProgressView == null) { 
      LayoutInflater inflater = LayoutInflater.from(KnowledgeBaseFragment.this.getActivity().getApplicationContext()); 
      mVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null); 
     } 

     return mVideoProgressView; 
    } 

    @Override 
    public boolean onError(MediaPlayer mp, int what, int extra) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     this.onHideCustomView(); 
    } 
} 

Bitte beachte, dass ich das so innerhalb eines Fragments tue, es ist wirklich größer anzeigen zu machen hatte ich fest Paar, um es mit der Aktivität, so dass es anhängen könnte das FrameLayout im Stammverzeichnis der gesamten Ansichtshierarchie, nicht nur das Fragment.

Hier sind die Funktionen:

@Override 
public void displayFullscreenView(View customView) { 
    parentLayout.addView(customView); 
    this.customView = customView; 
} 

@Override 
public void removeFullscreenView() { 
    if (customView != null) { 
     customView.setVisibility(View.GONE); 
     parentLayout.removeView(customView); 
    } 

    customView = null; 
} 

Hier ist eine andere Frage Sie folgende Aufgaben: WebView and HTML5 <video>

+1

Ich habe nicht in diesem Code in ein paar Monaten sah. Viele halbierte Operationen und übrig gebliebene Variablen. > MattC

+1

Danke! Ich musste den Code ein wenig optimieren, aber ich könnte ihn verwenden. – Pascal