在Android的视频初始屏幕期间预加载WebView

问题描述:

我正在Android应用中工作,我想在webView加载网页时预加载初始屏幕但是我有一个本地.mp4视频而不是图片。在Android的视频初始屏幕期间预加载WebView

所以一旦用户点击应用程序,.mp4将开始播放(4秒)。在这4秒内,webView应该预先加载网页SO当视频完成后显示我的网页(如果网页已经加载),否则请等待启动画面,直到网页准备就绪,然后加载它。

这里是我的MainActivity:

public class MainActivity extends AppCompatActivity { 

    private WebView webView; 
    public static final Object SPLASH_LOCK = new Object(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     String myURL = "https://www.testpage.com"; 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     webView = (WebView) findViewById(R.id.webView); 
     webView.getSettings().setAllowContentAccess(true); 

     /** tell the webView to enable javascript execution */ 
     WebSettings webSettings = webView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 

     webView.getSettings().setDomStorageEnabled(true); 
     webView.getSettings().setDatabaseEnabled(true); 

     webSettings.getAllowFileAccessFromFileURLs(); 
     webSettings.getAllowUniversalAccessFromFileURLs(); 

     /** Load the HTML page */ 
     webView.loadUrl(myURL); 

     /** Call the JavaScriptInterface within the WebView */ 
     webView.addJavascriptInterface(this, "jsinterface"); 

     startActivity(new Intent(this, AnimationScreenActivity.class)); 

     /** Enable Javascript in WebView 
     /callback for browser events */ 
     webView.setWebViewClient(new WebViewClient(){ 

      @Override 
      public void onPageFinished (WebView webView, String url) { 
       synchronized (SPLASH_LOCK) { 
        SPLASH_LOCK.notifyAll(); 
       } 
      } 
     }); 
    } 
} 

这里是AnimationScreenActivity:

public class AnimationScreenActivity extends AppCompatActivity{ 

    private static String TAG = AnimationScreenActivity.class.getName(); 
    private static long MAX_SPLASH_TIME = 10000; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.animation_screen); 

       try { 
        VideoView videoHolder = (VideoView) findViewById(R.id.videoView1); 
        Uri video = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.myvideo); 
        videoHolder.setVideoURI(video); 

        videoHolder.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
         public void onCompletion(MediaPlayer mp) { 

          jump(); 
         } 
        }); 
        videoHolder.start(); 
       } catch (Exception ex) { jump(); } 

    } 

    private void jump() { 
     new Thread() { 
      @Override 
      public void run() { 
       synchronized (MainActivity.SPLASH_LOCK) { 
        // wait for notify or time-out 
        try { 
         MainActivity.SPLASH_LOCK.wait(MAX_SPLASH_TIME); 
        } catch (InterruptedException ignored) {} 
       } 
       finish(); 
      } 
     }.start(); 

    } 
} 

这里是activity_main.xml中:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="test.test_android.MainActivity"> 

    <WebView 
     android:id="@+id/webView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</RelativeLayout> 

这里是animation_screen_activity.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/animation_screen" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="test.test.AnimationScreenActivity"> 

    <VideoView 
     android:id="@+id/videoView1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentBottom="true" /> 

</RelativeLayout> 

而且最后的Manifest.xml这里我设置MainActivity为LAUNCHER:

<activity android:name=".MainActivity" 
        android:theme="@style/FullScreenTheme" 
        android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     </activity> 

     <activity android:name=".AnimationScreenActivity" 
        android:theme="@style/FullScreenTheme" 
        android:screenOrientation="portrait"/> 

所以我直到现在是,一旦用户启动应用程序时,.MP4开始当.MP4完成那么它会在AnimationScreenActivity中等待10秒,然后加载网页,然后再等待THEN

任何帮助将不胜感激!

你可以有一个单一的活动,有你有2个活动什么,由具有ViewSwitcher(或ViewAnimator)的布局之间进行切换。 这也将消除对SPLASH_LOCK对象的需要。

加载时,将ViewSwitcher(或ViewAnimator)切换到视频的布局,并且当您完成加载页面时,将其切换到WebView的布局。

我已经做了一个简单的代码,以方便在视图之间切换。如果你愿意,你可以使用它:

public static void setViewToSwitchTo(@NonNull final ViewAnimator viewAnimator, @NonNull final View viewToSwitchTo) { 
    if (viewAnimator == null) 
     return; 
    if (viewAnimator.getCurrentView() == viewToSwitchTo) 
     return; 
    for (int i = 0; i < viewAnimator.getChildCount(); ++i) 
     if (viewAnimator.getChildAt(i) == viewToSwitchTo) { 
      viewAnimator.setDisplayedChild(i); 
      break; 
     } 
} 

public static void setViewToSwitchTo(@NonNull final ViewAnimator viewAnimator, @IdRes final int viewIdToSwitchTo) { 
    if (viewAnimator == null) 
     return; 
    if (viewAnimator.getCurrentView().getId() == viewIdToSwitchTo) 
     return; 
    for (int i = 0; i < viewAnimator.getChildCount(); ++i) 
     if (viewAnimator.getChildAt(i).getId() == viewIdToSwitchTo) { 
      if (viewAnimator.getDisplayedChild() == i) 
       return; 
      viewAnimator.setDisplayedChild(i); 
      return; 
     } 
} 

用法:

setViewToSwitchTo(viewSwitcher, R.id.webViewLayout); 

或:

setViewToSwitchTo(viewSwitcher, webViewLayout); 

你甚至可以有视图之间切换时的动画,使用 “inAnimation”和“outAnimation”属性。

而且,如果代码太大,您可以使用片段而不是视图。一个用于WebView,另一个用于视频。

关于onPageFinished被多次调用,您需要检查其中哪一个是您认为正在完成的那个。由于每个网站都不同,并且可以有多个框架,所以您必须添加此逻辑。如果你愿意,你可以监控onPageStarted,如下所示:

顺便说一句,如果你在清单中改变方向,千万注意,因为你有一个web视图,你将不得不考虑如何改变方向,因为它不能很好地恢复状态。


编辑:

这里的布局文件:

<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/viewSwitcher" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="test.test_android.MainActivity"> 

    <VideoView 
     android:id="@+id/videoView1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <WebView 
     android:id="@+id/webView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" /> 

</ViewSwitcher> 

在OnCreate,同时使用你的活动的代码,并添加此去视频:

setViewToSwitchTo(viewSwitcher, R.id.videoView1); 

,这要到web视图(当它已经完成加载,你的情况):

setViewToSwitchTo(viewSwitcher, R.id.webView); 
+0

感谢您的回答! 'onPageFinished'不会被多次调用。我在Manifest中改变方向的原因是因为我希望它始终处于肖像模式。另外,如果我使用ViewSwitcher或ViewAnimator,这将如何解决飞溅(动画)期间加载网页的问题? 是否有可能提供我的代码如何做到这一点? – Johny

+0

所以我必须使用你提供的两个代码之一?我如何在代码中使用它? – Johny

+0

是的,它会正常工作。活动的布局将ViewSwitcher作为父视图的父视图:视图之一和视频之一。 –

我的建议是避免有2个活动,我怀疑这是你的问题之一。

在RelativeLayout中只有一个活动VideoViewWebView,以便VideoView位于WebView的上方。

当的WebView准备好了,只是VideoView.setVisibity(View.GONE)

+0

谢谢您的回答,但如果我不VideoView.setVisibity(View.GONE),它会在中间,在这里我想它完成不管停止视频什么然后加载网页。 另外,你的意思是有一个活动和一个布局以及VideoView和WebView? – Johny

+0

@Johny我的意思是当视频结束并加载WebView时,更改可见性。与您的代码完全相同,但在单个活动中。 – neteinstein

+0

所以首先我必须只使用一个布局,将有两个VideoView和的WebView(而不是2个布局)以及一个活动,将尽一切还视频部分和网页视图。 我会试试这个,但有可能写的代码应该如何? – Johny

从@android开发了很多帮助后(非常感谢!)和计算器的帖子,我已经联合两种活动MainActivityAnimationScreenActivity在一个活动(MainActivity)。

下面是代码:

public class MainActivity extends AppCompatActivity { 
     private String myURL = "https://www.testpage.com"; 
     VideoView videoView; 
     ViewSwitcher viewSwitcher; 
     private WebView webView; 
     private boolean hasFinishedLoadingPage; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      try { 
       viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher); 
       final VideoView videoView = (VideoView) findViewById(R.id.videoView1); 
       Uri video = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.myvideo); 
       videoView.setVideoURI(video); 

       videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
        @Override 
        public void onCompletion(MediaPlayer mp) { 
         if (hasFinishedLoadingPage) 
          setViewToSwitchTo(viewSwitcher, webView); 

         // else webView.reload(); 

        setViewToSwitchTo(viewSwitcher, webView); 

        } 
       }); 

       videoView.start(); 
      } catch (Exception ex) { 
      } 

      webView = (WebView) findViewById(R.id.webView); 
      webView.getSettings().setAllowContentAccess(true); 
      WebSettings webSettings = webView.getSettings(); 
      webSettings.setJavaScriptEnabled(true); 
      webView.getSettings().setDomStorageEnabled(true); 
      webView.getSettings().setDatabaseEnabled(true); 
      webSettings.getAllowFileAccessFromFileURLs(); 
      webSettings.getAllowUniversalAccessFromFileURLs(); 

      webView.setWebViewClient(new WebViewClient() { 

       boolean isRedirected; 

       @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        return false; 
       } 

       @Override 
       public void onPageStarted(WebView view, String url, Bitmap favicon) { 
        super.onPageStarted(view, url, favicon); 
        if (!isRedirected) { 
         setViewToSwitchTo(viewSwitcher, videoView); 
        } 
        isRedirected = true; 
       } 

       @Override 
       public void onPageFinished(WebView webView, String url) { 
        super.onPageFinished(webView, url); 
        hasFinishedLoadingPage = true; 
       } 
      }); 

      /** Callback for web events */ 
      webView.setWebChromeClient(new WebChromeClient() { 
      }); 
      webView.loadUrl(myURL); 
     } 

     public static void setViewToSwitchTo(@NonNull final ViewAnimator viewAnimator, @NonNull final View viewToSwitchTo) { 
      if (viewAnimator == null) 
       return; 
      if (viewAnimator.getCurrentView() == viewToSwitchTo) 
       return; 
      for (int i = 0; i < viewAnimator.getChildCount(); ++i) 
       if (viewAnimator.getChildAt(i) == viewToSwitchTo) { 
        viewAnimator.setDisplayedChild(i); 
        break; 
       } 
     } 
    } 
+0

工程就像一个魅力! – Steven

+1

真正的现场救星! – Steven

+1

很高兴帮助你:) – Johny