WebView e HTML5 <video>


122

Sto mettendo insieme un'app a buon mercato che tra le altre cose "incornicia" alcuni dei nostri siti Web ... Piuttosto semplice con il WebViewClient . finché non colpisco il video.

Il video è fatto come HTML5 elementi e questi funzionano bene e alla perfezione su Chrome, iPhone e ora che abbiamo risolto i problemi di codifica su cui funziona benissimoAndroid nel browser nativo.

Ora il problema: WebView problema non gli piace. Affatto. Posso fare clic sull'immagine del poster e non succede nulla.

Cercando su Google, ho trovato questo che è vicino, ma sembra essere basato su un "link" (come in un href ...) invece che su un elemento video. (onDownloadListener non sembra essere richiamato sugli elementi video ...)

Vedo anche riferimenti all'override di onShowCustomView, ma sembra che non venga richiamato sugli elementi video ... né dovrebbeOverrideUrlLoading ..

Preferirei non entrare in "pull xml dal server, riformattarlo nell'app" .. mantenendo il layout della storia sul server, posso controllare un po 'meglio il contenuto senza costringere le persone a continuare ad aggiornare un'app. Quindi, se riesco a convincere WebView a gestire tag come il browser nativo, sarebbe meglio.

Mi manca chiaramente qualcosa di ovvio .. ma non ho idea di cosa.



Sulla stessa linea, sto cercando un lettore HTML5 per il mio sito web. Cosa dovrei usare?
Wolfpack'08


1
Niente ha funzionato così ho guardato in VideoEnabledWebViewqui stackoverflow.com/questions/15768837/...
EpicPandaForce

Risposte:


92

Rispondo a questo argomento solo nel caso qualcuno lo legga e sia interessato al risultato. È possibile visualizzare un elemento video (tag video html5) all'interno di una WebView, ma devo dire che ho dovuto affrontarlo per alcuni giorni. Questi sono i passaggi che ho dovuto seguire finora:

-Trova un video codificato correttamente

-Quando si inizializza WebView, impostare JavaScript, Plug-in WebViewClient e WebChromeClient.

url = nuova stringa ("http://broken-links.com/tests/video/"); 
mWebView = (WebView) findViewById (R.id.webview);
mWebView.setWebChromeClient (chromeClient);
mWebView.setWebViewClient (wvClient);
mWebView.getSettings () setJavaScriptEnabled (true).;
. MWebView.getSettings () setPluginState (PluginState.ON);
mWebView.loadUrl (url);

-Handle onShowCustomView nell'oggetto WebChromeClient.

@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
    super.onShowCustomView(view, callback);
    if (view instanceof FrameLayout){
        FrameLayout frame = (FrameLayout) view;
        if (frame.getFocusedChild() instanceof VideoView){
            VideoView video = (VideoView) frame.getFocusedChild();
            frame.removeView(video);
            a.setContentView(video);
            video.setOnCompletionListener(this);
            video.setOnErrorListener(this);
            video.start();
        }
    }
}

-Gestire gli eventi onCompletion e onError per il video, al fine di tornare alla visualizzazione web.

public void onCompletion(MediaPlayer mp) {
    Log.d(TAG, "Video completo");
    a.setContentView(R.layout.main);
    WebView wb = (WebView) a.findViewById(R.id.webview);
    a.initWebView();
}

Ma ora dovrei dire che c'è ancora una questione importante. Posso suonarlo solo una volta. La seconda volta che clicco sul dispatcher del video (il poster o un pulsante di riproduzione), non fa nulla.

Vorrei anche che il video venga riprodotto all'interno del frame WebView, invece di aprire la finestra di Media Player, ma questo è per me un problema secondario.

Spero che aiuti qualcuno e ringrazio anche qualsiasi commento o suggerimento.

Saludos, terrícolas.


Non eseguo alcun risultato, il mio schermo è nero. Voglio sapere se questo ha bisogno di te. il mio codice è troppo lungo per essere inserito qui. puoi darmi un modo di contatto o aprire un altro argomento.
pengwang

Sei completamente sicuro che non sia un problema di codifica? Prova con l'URL che ho pubblicato. Ovviamente deve funzionare con il browser nativo
mdelolmo

46
cos'è "a"? come quell'attività sarebbe?
Collin Price

1
@Collin Price a è un'istanza dell'attività che ospita la visualizzazione web. @desgraci, posso fornirlo, ma non c'è molto oltre a questo. Fai in modo che una classe estenda WebChromeCliente sovrascriva i metodi corrispondenti di cui hai bisogno. Se insisti, posso caricare il resto della classe più tardi quando torno a casa.
mdelolmo

6
Non funziona su ICS poiché getFocusedChild () non è un VideoView, ma un HTML5VFullScreen $ SurfaceVideoView. Qualche idea su come fare su ICS? (vedi stackoverflow.com/questions/13540654/…
Pascal

61

Dopo lunghe ricerche, ho trovato questa cosa funzionante. Vedere il codice seguente:

Test.java

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;

public class Test extends Activity {

    HTML5WebView mWebView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mWebView = new HTML5WebView(this);

        if (savedInstanceState != null) {
            mWebView.restoreState(savedInstanceState);
        } else {    
            mWebView.loadUrl("http://192.168.1.18/xxxxxxxxxxxxxxxx/");
        }

        setContentView(mWebView.getLayout());
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mWebView.saveState(outState);
    }

    @Override
    public void onStop() {
        super.onStop();
        mWebView.stopLoading();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (mWebView.inCustomView()) {
                mWebView.hideCustomView();
            //  mWebView.goBack();
                //mWebView.goBack();
                return true;
            }

        }
        return super.onKeyDown(keyCode, event);
    }
}

HTML% VIDEO.java

package com.ivz.idemandtest;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;

public class HTML5WebView extends WebView {

    private Context                             mContext;
    private MyWebChromeClient                   mWebChromeClient;
    private View                                mCustomView;
    private FrameLayout                         mCustomViewContainer;
    private WebChromeClient.CustomViewCallback  mCustomViewCallback;

    private FrameLayout                         mContentView;
    private FrameLayout                         mBrowserFrameLayout;
    private FrameLayout                         mLayout;

    static final String LOGTAG = "HTML5WebView";

    private void init(Context context) {
        mContext = context;     
        Activity a = (Activity) mContext;

        mLayout = new FrameLayout(context);

        mBrowserFrameLayout = (FrameLayout) LayoutInflater.from(a).inflate(R.layout.custom_screen, null);
        mContentView = (FrameLayout) mBrowserFrameLayout.findViewById(R.id.main_content);
        mCustomViewContainer = (FrameLayout) mBrowserFrameLayout.findViewById(R.id.fullscreen_custom_content);

        mLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS);

        // Configure the webview
        WebSettings s = getSettings();
        s.setBuiltInZoomControls(true);
        s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        s.setUseWideViewPort(true);
        s.setLoadWithOverviewMode(true);
      //  s.setSavePassword(true);
        s.setSaveFormData(true);
        s.setJavaScriptEnabled(true);
        mWebChromeClient = new MyWebChromeClient();
        setWebChromeClient(mWebChromeClient);

        setWebViewClient(new WebViewClient());

setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);

        // enable navigator.geolocation 
       // s.setGeolocationEnabled(true);
       // s.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");

        // enable Web Storage: localStorage, sessionStorage
        s.setDomStorageEnabled(true);

        mContentView.addView(this);
    }

    public HTML5WebView(Context context) {
        super(context);
        init(context);
    }

    public HTML5WebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public HTML5WebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    public FrameLayout getLayout() {
        return mLayout;
    }

    public boolean inCustomView() {
        return (mCustomView != null);
    }

    public void hideCustomView() {
        mWebChromeClient.onHideCustomView();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if ((mCustomView == null) && canGoBack()){
                goBack();
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    private class MyWebChromeClient extends WebChromeClient {
        private Bitmap      mDefaultVideoPoster;
        private View        mVideoProgressView;

        @Override
        public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)
        {
            //Log.i(LOGTAG, "here in on ShowCustomView");
            HTML5WebView.this.setVisibility(View.GONE);

            // if a view already exists then immediately terminate the new one
            if (mCustomView != null) {
                callback.onCustomViewHidden();
                return;
            }

            mCustomViewContainer.addView(view);
            mCustomView = view;
            mCustomViewCallback = callback;
            mCustomViewContainer.setVisibility(View.VISIBLE);
        }

        @Override
        public void onHideCustomView() {
            System.out.println("customview hideeeeeeeeeeeeeeeeeeeeeeeeeee");
            if (mCustomView == null)
                return;        

            // Hide the custom view.
            mCustomView.setVisibility(View.GONE);

            // Remove the custom view from its container.
            mCustomViewContainer.removeView(mCustomView);
            mCustomView = null;
            mCustomViewContainer.setVisibility(View.GONE);
            mCustomViewCallback.onCustomViewHidden();

            HTML5WebView.this.setVisibility(View.VISIBLE);
            HTML5WebView.this.goBack();
            //Log.i(LOGTAG, "set it to webVew");
        }


        @Override
        public View getVideoLoadingProgressView() {
            //Log.i(LOGTAG, "here in on getVideoLoadingPregressView");

            if (mVideoProgressView == null) {
                LayoutInflater inflater = LayoutInflater.from(mContext);
                mVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null);
            }
            return mVideoProgressView; 
        }

         @Override
         public void onReceivedTitle(WebView view, String title) {
            ((Activity) mContext).setTitle(title);
         }

         @Override
         public void onProgressChanged(WebView view, int newProgress) {
             ((Activity) mContext).getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress*100);
         }

         @Override
         public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
             callback.invoke(origin, true, false);
         }
    }


    static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS =
        new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

custom_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android">
    <FrameLayout android:id="@+id/fullscreen_custom_content"
        android:visibility="gone"
        android:background="@color/black"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />
    <LinearLayout android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout android:id="@+id/error_console"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
        />

        <FrameLayout android:id="@+id/main_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
        />
    </LinearLayout>
</FrameLayout>

video_loading_progress.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/progress_indicator"
         android:orientation="vertical"
         android:layout_centerInParent="true"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content">

       <ProgressBar android:id="@android:id/progress"
           style="?android:attr/progressBarStyleLarge"
           android:layout_gravity="center"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content" />

       <TextView android:paddingTop="5dip"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center"
           android:text="@string/loading_video" android:textSize="14sp"
           android:textColor="?android:attr/textColorPrimary" />
 </LinearLayout>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/assets/res/any/http_authentication_colors.xml
**
** Copyright 2006, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License"); 
** you may not use this file except in compliance with the License. 
** You may obtain a copy of the License at 
**
**     http://www.apache.org/licenses/LICENSE-2.0 
**
** Unless required by applicable law or agreed to in writing, software 
** distributed under the License is distributed on an "AS IS" BASIS, 
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
** See the License for the specific language governing permissions and 
** limitations under the License.
*/
-->
<!-- FIXME: Change the name of this file!  It is now being used generically
    for the browser -->
<resources>
    <color name="username_text">#ffffffff</color>
    <color name="username_edit">#ff000000</color>

    <color name="password_text">#ffffffff</color>
    <color name="password_edit">#ff000000</color>

    <color name="ssl_text_label">#ffffffff</color>
    <color name="ssl_text_value">#ffffffff</color>

    <color name="white">#ffffffff</color>
    <color name="black">#ff000000</color>



    <color name="geolocation_permissions_prompt_background">#ffdddddd</color>
</resources>

manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Test"
                  android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:configChanges="orientation|keyboardHidden|keyboard">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>  
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
</manifest>

Aspettandosi il resto delle cose che puoi capire.


7
Questa dovrebbe essere la risposta accettata. Surendra e Malenkiy avete entrambi salvato la mia sanità mentale. Ha funzionato alla grande per me.
George Baker

Sono d'accordo con George. Questo è esattamente il modo in cui funziona il browser nativo di Android con VideoView. Sembra che questo sia lo stesso codice di code.google.com/p/html5webview . Funziona alla grande per tutte le versioni di Android (ho provato su Android 2.2 e versioni successive). Solo una cosa che volevo notare, dovresti tenere presente che se modifichi l'SDK di destinazione su un valore superiore a 13, la tua attività verrà ricreata al cambio dell'orientamento. Per evitare ciò, aggiungi screenSize ad android: configChanges (ma in questo caso dovrai usare min sdk <13) o usa il vecchio SDK di destinazione (quindi puoi mantenere android: configChanges)
Yuriy Ashaev

2
Questo mi dà una schermata bianca e vuota su Nexus 7 (Android 4.1). Qualche idea su come risolvere questo problema?
Sahil

Il pulsante Indietro non ferma il video e l'audio è ancora udibile, qualche idea su come risolvere questo problema?
CONvid19

Questo è quello che stavo cercando esattamente come il flusso del browser nativo .. Grazie a Ton Surendra e Malenkiy.
Abhilash

33

La risposta di mdelolmo è stata incredibilmente utile, ma come ha detto, il video viene riprodotto solo una volta e quindi non è possibile riaprirlo.

Ho esaminato un po 'questo aspetto ed ecco cosa ho trovato, nel caso in cui i viaggiatori stanchi di WebView come me si imbatteranno in questo post in futuro.

Prima di tutto, ho esaminato la documentazione di VideoView e MediaPlayer e ho avuto un'idea migliore di come funzionano. Li raccomando vivamente.

Quindi, ho guardato il codice sorgente per vedere come lo fa il browser Android . Cerca una pagina e guarda come si comportano onShowCustomView(). Mantengono un riferimento alla CustomViewCallbacke alla visualizzazione personalizzata.

Con tutto ciò, e tenendo a mente la risposta di mdelolmo, quando hai finito con il video, tutto ciò che devi fare sono due cose. Per prima cosa, sul VideoViewquale hai salvato un riferimento, chiama stopPlayback()che rilascerà il MediaPlayerper essere utilizzato in seguito altrove. Puoi vederlo nel codice sorgente di VideoView . In secondo luogo, CustomViewCallbackhai salvato un riferimento per chiamareCustomViewCallback.onCustomViewHidden() .

Dopo aver fatto queste due cose, puoi fare clic sullo stesso video o su qualsiasi altro video e si aprirà come prima. Non è necessario riavviare l'intero WebView.

Spero che aiuti.


In realtà l'ho risolto anche io, semplicemente non mi sono ricordato di pubblicare la soluzione (vergogna su di me). Proprio come te, ho dovuto dare un'occhiata al codice del browser Android e, beh, non c'è molto da aggiungere, ho usato invece l'ascoltatore onCompletion per fermare il Player e ho dovuto impostare la visibilità un paio di volte, ma comprerei la tua soluzione. Saluti!
mdelolmo

1
Google Code Search è stato ritirato, penso che questa versione di BrowserActivity.java (da Froyo) corrisponda all'incirca a quella descritta qui: github.com/android/platform_packages_apps_browser/blob/…
michiakig

Il codice collegato di @ spacemanki non contiene alcuna menzione di VideoView nell'intero repository. Immagino che BrowserActivity lo faccia in modo diverso ora. Sono persino tornato al rilascio di Eclair. Non riesco a trovare alcun utilizzo.
mxcl

Il problema che ho con tutto questo è che quello che sto ottenendo da frame.getFocusedChild (); è un HTml5VideoView invece di un ViewView e quindi niente di tutto questo funziona per me e non posso passare allo schermo intero :( Sono su Android 4.1.2.
Gonan

1
Quello che alla fine ha fatto per me è stato aggiungere: @Override public void onStop () {super.onStop (); mWebView.destroy (); } all'attività ... il webview.destroy () è stato cruciale
MacD

8

In realtà, sembra sufficiente allegare semplicemente un WebChromeClient stock alla vista client, ala

mWebView.setWebChromeClient(new WebChromeClient());

e devi avere l'accelerazione hardware attivata!

Almeno, se non è necessario riprodurre un video a schermo intero, non è necessario estrarre VideoView da WebView e spingerlo nella visualizzazione dell'attività. Verrà riprodotto nel rettangolo assegnato all'elemento video.

Qualche idea su come intercettare il pulsante di espansione del video?


puoi intercettarlo utilizzando WebChromeClient e sovrascrivendo su ShowCustomView
Frank

Si prega di specificare quale versione di Android. Funziona in modo diverso per le diverse versioni.
Ethan_AI

7

So che questo thread è vecchio di diversi mesi, ma ho trovato una soluzione per riprodurre il video all'interno del WebView senza farlo a schermo intero (ma ancora nel lettore multimediale ...). Finora non ho trovato alcun suggerimento su questo in Internet, quindi forse questo è interessante anche per gli altri. Sto ancora lottando su alcuni problemi (ad esempio, posizionare il lettore multimediale nella sezione destra dello schermo, non so perché lo sto facendo male, ma credo sia un problema relativamente piccolo ...).

In Custom ChromeClient specificare LayoutParams:

// 768x512 is the size of my video
FrameLayout.LayoutParams LayoutParameters = 
                                     new FrameLayout.LayoutParams (768, 512); 

Il mio metodo onShowCustomView ha questo aspetto:

public void onShowCustomView(final View view, final CustomViewCallback callback) {
     // super.onShowCustomView(view, callback);
     if (view instanceof FrameLayout) {
         this.mCustomViewContainer = (FrameLayout) view;
         this.mCustomViewCallback = callback;
         this.mContentView = (WebView) this.kameha.findViewById(R.id.webview);
         if (this.mCustomViewContainer.getFocusedChild() instanceof VideoView) {
             this.mCustomVideoView = (VideoView) 
                                     this.mCustomViewContainer.getFocusedChild();
             this.mCustomViewContainer.setVisibility(View.VISIBLE);
             final int viewWidth = this.mContentView.getWidth();
             final int viewLeft = (viewWidth - 1024) / 2;
             // get the x-position for the video (I'm porting an iPad-Webapp to Xoom, 
             // so I can use those numbers... you have to find your own of course...
             this.LayoutParameters.leftMargin = viewLeft + 256; 
             this.LayoutParameters.topMargin = 128;
             // just add this view so the webview underneath will still be visible, 
             // but apply the LayoutParameters specified above
             this.kameha.addContentView(this.mCustomViewContainer, 
                                             this.LayoutParameters); 
             this.mCustomVideoView.setOnCompletionListener(this);
             this.mCustomVideoView.setOnErrorListener(this);
             // handle clicks on the screen (turning off the video) so you can still
             // navigate in your WebView without having the video lying over it
             this.mCustomVideoView.setOnFocusChangeListener(this); 
             this.mCustomVideoView.start();
         }
     }
 }

Quindi, spero di poter aiutare ... Anch'io ho dovuto giocare con la codifica video e ho visto diversi tipi di utilizzo di WebView con video html5 - alla fine il mio codice funzionante era un mix selvaggio di diverse parti di codice che ho trovato in Internet e alcune cose che ho dovuto capire da solo. È stato davvero un dolore in a *.


Su ICS, getFocusedChild () non restituisce un VideoView. Qualche idea su come farlo funzionare su ICS?
Pascal

4

Questo approccio funziona bene fino a 2.3 E aggiungendo hardwareaccelerated = true funziona anche da 3.0 a ICS Un problema che sto affrontando attualmente è al secondo avvio dell'applicazione del lettore multimediale che si blocca perché non ho interrotto la riproduzione e rilasciato Media player. Poiché gli oggetti VideoSurfaceView, che otteniamo nella funzione onShowCustomView dal sistema operativo 3.0, sono specifici del browser e non un oggetto VideoView come nel sistema operativo, fino a 2.3 Come posso accedervi e interrompere la riproduzione e rilasciare le risorse?


3

AM's è simile a ciò che BrowerActivity fa . per FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams (768, 512);

Penso che possiamo usare

FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT,
            FrameLayout.LayoutParams.FILL_PARENT) 

anziché.

Un altro problema che ho riscontrato è se il video è in riproduzione e l'utente fa clic sul pulsante Indietro, la prossima volta vai a questa attività (singleTop one) e non puoi riprodurre il video. per risolvere questo problema, ho chiamato il file

try { 
    mCustomVideoView.stopPlayback();  
    mCustomViewCallback.onCustomViewHidden();
} catch(Throwable e) { //ignore }

nel metodo onBackPressed dell'attività.


2

So che questa è una domanda molto vecchia, ma hai provato il file hardwareAccelerated="true" flag manifest per la tua applicazione o attività?

Con questo set, sembra funzionare senza alcuna modifica a WebChromeClient (cosa che mi aspetterei da un elemento DOM).


2
hardwareAcceleratedinizia da Android 3.0
vbence

2

Ho usato html5webview per risolvere questo problema, scaricalo e inseriscilo nel tuo progetto, quindi puoi codificare proprio come questo.

private HTML5WebView mWebView;
String url = "SOMEURL";
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mWebView = new HTML5WebView(this);
    if (savedInstanceState != null) {
            mWebView.restoreState(savedInstanceState);
    } else {
            mWebView.loadUrl(url);
    }
    setContentView(mWebView.getLayout());
}
@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mWebView.saveState(outState);
}

Per rendere il video ruotabile, inserisci il codice android: configChanges = "orientamento" nella tua attività, ad esempio (Androidmanifest.xml)

<activity android:name=".ui.HTML5Activity" android:configChanges="orientation"/>

ed eseguire l'override del metodo onConfigurationChanged.

@Override
public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
}

2

Questa domanda è vecchia di anni, ma forse la mia risposta aiuterà le persone come me che devono supportare la vecchia versione di Android. Ho provato molti approcci diversi che funzionavano su alcune versioni di Android, ma non su tutte. La soluzione migliore che ho trovato è utilizzare Crosswalk Webview che è ottimizzato per il supporto delle funzionalità HTML5 e funziona su Android 4.1 e versioni successive. È semplice da usare come Android WebView predefinito. Devi solo includere la libreria. Qui puoi trovare un semplice tutorial su come usarlo: https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/


Nota: l'attraversamento pedonale non viene più mantenuto .
slhck

1

Bene, a quanto pare questo non è possibile senza utilizzare un JNI per registrare un plug-in per ottenere l'evento video. (Personalmente, evito JNI poiché non voglio davvero affrontare un pasticcio quando i tablet Android basati su Atom usciranno nei prossimi mesi, perdendo la portabilità di Java.)

L'unica vera alternativa sembra essere quella di creare una nuova pagina web solo per WebView e fare video alla vecchia maniera con un collegamento A HREF come citato nell'URL di Codelark sopra.

Icky.


1

Su nido d'ape hardwareaccelerated=truee pluginstate.on_demandsembra funzionare


1

Ho avuto un problema simile. Avevo file HTML e video nella cartella delle risorse della mia app.

Pertanto i video si trovavano all'interno dell'APK. Poiché l'APK è in realtà un file ZIP, WebView non è stato in grado di leggere i file video.

Copiare tutti i file HTML e video sulla scheda SD ha funzionato per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.