WebView dan HTML5 <video>


122

Saya sedang menyusun aplikasi murah yang antara lain "membingkai" beberapa situs web kami ... Cukup sederhana dengan WebViewClient. sampai saya memutar video.

Video selesai sebagai HTML5 elemen, dan ini berfungsi dengan baik dan keren di Chrome, iPhone, dan sekarang setelah kami memperbaiki masalah enkode, ia berfungsi dengan baik Androiddi browser asli.

Sekarang intinya: WebViewtidak menyukainya. Sama sekali. Saya dapat mengklik gambar poster, dan tidak ada yang terjadi.

Googling, saya menemukan ini yang dekat, tetapi tampaknya didasarkan pada 'link' (seperti dalam a href ...) bukan elemen video. (onDownloadListener tampaknya tidak dipanggil pada elemen video ...)

Saya juga melihat referensi untuk mengganti onShowCustomView, tetapi tampaknya itu tidak dipanggil pada elemen video ... juga tidak shouldOverrideUrlLoading ..

Saya lebih suka tidak masuk ke "tarik xml dari server, format ulang dalam aplikasi" .. dengan menjaga tata letak cerita di server, saya dapat mengontrol konten sedikit lebih baik tanpa memaksa orang untuk terus memperbarui aplikasi. Jadi jika saya bisa meyakinkan WebView untuk menangani tag seperti browser asli, itu akan menjadi yang terbaik.

Saya jelas kehilangan sesuatu yang jelas .. tapi saya tidak tahu apa.



Sejalan dengan itu, saya mencari pemutar HTML5 untuk situs web saya. Apa yang harus saya gunakan?
Wolfpack'08


1
Tidak ada yang berhasil jadi saya melihat ke VideoEnabledWebViewsini stackoverflow.com/questions/15768837/…
EpicPandaForce

Jawaban:


92

Saya menjawab topik ini kalau-kalau ada yang membacanya dan tertarik dengan hasilnya. Dimungkinkan untuk melihat elemen video (tag html5 video) dalam WebView, tetapi saya harus mengatakan bahwa saya harus menanganinya selama beberapa hari. Ini adalah langkah-langkah yang harus saya ikuti sejauh ini:

-Cari video yang dikodekan dengan benar

-Ketika menginisialisasi WebView, setel JavaScript, Plug-in WebViewClient, dan WebChromeClient.

url = String baru ("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 di objek 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();
        }
    }
}

-Tangani peristiwa onCompletion dan onError untuk video tersebut, untuk kembali ke tampilan 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();
}

Tapi sekarang saya harus mengatakan masih ada masalah penting. Saya hanya bisa memainkannya sekali. Kedua kalinya saya mengklik dispatcher video (baik poster atau tombol putar), itu tidak melakukan apa-apa.

Saya juga ingin video diputar di dalam bingkai WebView, daripada membuka jendela Media Player, tetapi bagi saya ini adalah masalah sekunder.

Saya harap ini membantu seseorang, dan saya juga akan berterima kasih atas komentar atau saran apa pun.

Saludos, terrícolas.


saya tidak menjalankan hasil apa pun, layar saya hitam. Saya ingin tahu apakah ini perlu thead. kode saya terlalu panjang untuk diajukan di sini. dapatkah Anda memberi saya cara kontak atau membuka topik lain.
pengwang

Apakah Anda benar-benar yakin ini bukan masalah encoding? Coba dengan URL yang saya posting. Jelas itu harus bekerja dengan browser asli
mdelolmo

46
apa itu "a"? seperti apakah kegiatan itu?
Harga Collin

1
@Collin Harga a adalah turunan dari Aktivitas yang menghosting tampilan web. @desgraci, saya dapat menyediakannya, tetapi tidak banyak selain itu. Buat kelas memperluas WebChromeClientdan mengganti metode terkait yang Anda butuhkan. Jika Anda bersikeras, saya dapat mengupload kelas lainnya nanti saat saya pulang.
mdelolmo

6
Tidak berfungsi di ICS karena getFocusedChild () bukanlah VideoView, tetapi HTML5VFullScreen $ SurfaceVideoView. Ada ide tentang bagaimana melakukannya di ICS? (lihat stackoverflow.com/questions/13540654/…
Pascal

61

Setelah penelitian panjang, saya mendapatkan hal ini bekerja. Lihat kode berikut:

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>

Mengharapkan hal-hal lain yang bisa Anda pahami.


7
Yang ini harus menjadi jawaban yang diterima. Surendra dan Malenkiy Anda berdua menyelamatkan kewarasan saya. Bekerja dengan baik untuk saya.
George Baker

Saya setuju dengan George. Ini persis seperti cara kerja browser asli Android dengan VideoView. Sepertinya kode ini sama seperti di sini code.google.com/p/html5webview . Ini berfungsi dengan baik untuk semua versi Android (saya uji pada Android 2.2 dan di atasnya). Hanya satu hal yang ingin saya perhatikan, Anda harus ingat bahwa jika Anda mengubah SDK target pada sesuatu di atas 13 maka aktivitas Anda akan dibuat ulang saat mengubah orientasi. Untuk menghindari hal ini, tambahkan screenSize ke android: configChanges (tetapi dalam kasus ini Anda perlu menggunakan min sdk <13) atau menggunakan SDK target lama (maka Anda dapat mempertahankan android: configChanges)
Yuriy Ashaev

2
Ini memberi saya layar kosong putih di nexus 7 (android 4.1). Tahu bagaimana cara memperbaikinya?
Sahil

Backbutton tidak menghentikan video dan audio masih terdengar, tahu bagaimana cara memperbaikinya?
CONvid19

Inilah yang saya cari persis sama dengan alur browser asli .. Terima kasih Ton Surendra dan Malenkiy.
Abhilash

33

Jawaban mdelolmo sangat membantu, tapi seperti yang dia katakan, videonya hanya diputar sekali dan Anda tidak bisa membukanya lagi.

Saya melihat ini sedikit dan inilah yang saya temukan, jika ada wisatawan WebView yang lelah seperti saya tersandung pada posting ini di masa mendatang.

Pertama, saya melihat dokumentasi VideoView dan MediaPlayer dan mendapatkan pemahaman yang lebih baik tentang cara kerjanya. Saya sangat merekomendasikan itu.

Kemudian, saya melihat kode sumber untuk melihat bagaimana Browser Android melakukannya. Lakukan pencarian halaman dan lihat bagaimana mereka menanganinya onShowCustomView(). Mereka menyimpan referensi ke CustomViewCallbackdan ke tampilan kustom.

Dengan semua itu, dan dengan jawaban mdelolmo, saat Anda selesai dengan videonya, yang perlu Anda lakukan hanyalah dua hal. Pertama, pada saat VideoViewAnda menyimpan referensi, panggilan stopPlayback()yang akan merilis MediaPlayeruntuk digunakan nanti di tempat lain. Anda dapat melihatnya di kode sumber VideoView . Kedua, pada CustomViewCallbackAnda menyimpan referensi untuk menelepon CustomViewCallback.onCustomViewHidden().

Setelah melakukan dua hal itu, Anda dapat mengklik video yang sama atau video lain dan itu akan terbuka seperti sebelumnya. Tidak perlu memulai ulang seluruh WebView.

Semoga membantu.


Sebenarnya saya agak menyelesaikannya juga, saya hanya tidak ingat untuk memposting solusinya (memalukan saya). Sama seperti Anda, saya harus melihat kode browser Android, dan tidak banyak yang bisa ditambahkan, saya menggunakan pendengar onCompletion untuk menghentikan Player dan harus mengatur visibilitas beberapa kali, tetapi saya akan membeli solusi Anda. Salam!
mdelolmo

1
Google Code Search telah dihentikan, menurut saya versi BrowserActivity.java ini (dari Froyo) kira-kira sesuai dengan yang dijelaskan di sini: github.com/android/platform_packages_apps_browser/blob/…
michiakig

Kode tertaut @ spacemanki tidak berisi penyebutan VideoView di seluruh repo. Saya kira BrowserActivity melakukannya secara berbeda sekarang. Saya bahkan kembali ke rilis Eclair. Tidak dapat menemukan penggunaan apa pun.
mxcl

Masalah yang saya miliki dengan semua ini adalah apa yang saya dapatkan kembali dari frame.getFocusedChild (); adalah HTml5VideoView dan bukan ViewView dan oleh karena itu semua ini tidak berfungsi untuk saya dan tidak dapat beralih ke layar penuh :( Saya menggunakan Android 4.1.2.
Gonan

1
Apa yang akhirnya berhasil bagi saya adalah menambahkan: @Override public void onStop () {super.onStop (); mWebView.destroy (); } untuk aktivitas ... webview.destroy () sangat penting
MacD

8

Sebenarnya, tampaknya cukup hanya melampirkan WebChromeClient saham ke tampilan klien, ala

mWebView.setWebChromeClient(new WebChromeClient());

dan Anda harus mengaktifkan akselerasi perangkat keras!

Setidaknya, jika Anda tidak perlu memutar video layar penuh, Anda tidak perlu menarik VideoView keluar dari WebView dan memasukkannya ke dalam tampilan Activity. Ini akan diputar di kotak yang dialokasikan untuk elemen video.

Ada ide bagaimana cara mencegat tombol perluas video?


Anda dapat mencegatnya menggunakan WebChromeClient dan mengganti onShowCustomView
Frank

Harap tentukan versi Android yang mana. Ini bekerja secara berbeda untuk versi yang berbeda.
Ethan_AI

7

Saya tahu utas ini berumur beberapa bulan, tetapi saya menemukan solusi untuk memutar video di dalam WebView tanpa melakukannya dalam layar penuh (tetapi masih di pemutar media ...). Sejauh ini saya tidak menemukan petunjuk apapun tentang ini di internet jadi mungkin ini juga menarik untuk orang lain. Saya masih berjuang dalam beberapa masalah (yaitu menempatkan pemutar media di bagian kanan layar, tidak tahu mengapa saya melakukan kesalahan tetapi menurut saya ini adalah masalah yang relatif kecil ...).

Di Custom ChromeClient tentukan LayoutParams:

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

Metode onShowCustomView saya terlihat seperti ini:

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();
         }
     }
 }

Jadi, saya harap saya dapat membantu ... Saya juga harus bermain-main dengan Video-Encoding dan melihat berbagai jenis penggunaan WebView dengan video html5 - pada akhirnya kode kerja saya adalah campuran liar dari berbagai bagian kode yang saya temukan di internet dan beberapa hal yang harus saya pikirkan sendiri. Benar-benar menyebalkan di a *.


Di ICS, getFocusedChild () tidak mengembalikan VideoView. Ada ide tentang cara membuat ini berfungsi di ICS?
Pascal

4

Pendekatan ini bekerja dengan baik hingga 2,3 Dan dengan menambahkan hardwareaccelerated = true bahkan bekerja dari 3.0 ke ICS Satu masalah yang saya hadapi saat ini adalah saat peluncuran kedua aplikasi pemutar media mengalami crash karena saya belum menghentikan pemutaran dan merilis pemutar Media. Karena objek VideoSurfaceView, yang kita dapatkan dalam fungsi onShowCustomView dari OS 3.0, khusus untuk browser dan bukan objek VideoView seperti pada, hingga OS 2.3. Bagaimana cara mengaksesnya dan menghentikanPlayback serta melepaskan sumber daya?


3

AM mirip dengan apa yang dilakukan BrowerActivity . untuk FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams (768, 512);

Saya pikir kita bisa menggunakan

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

sebagai gantinya.

Masalah lain yang saya temui adalah jika video sedang diputar, dan pengguna mengklik tombol kembali, lain kali, Anda pergi ke aktivitas ini (singleTop one) dan tidak dapat memutar video. untuk memperbaikinya, saya menelepon

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

dalam metode onBackPressed aktivitas.


2

Saya tahu ini adalah pertanyaan yang sangat lama, tetapi sudahkah Anda mencoba hardwareAccelerated="true"bendera manifes untuk aplikasi atau aktivitas Anda?

Dengan set ini, tampaknya berfungsi tanpa modifikasi WebChromeClient (yang saya harapkan dari Elemen DOM.)


2
hardwareAccelerateddimulai dari Android 3.0
vbence

2

Saya menggunakan html5webview untuk mengatasi masalah ini. Unduh dan masukkan ke dalam proyek Anda, lalu Anda dapat membuat kode seperti ini.

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);
}

Agar video dapat diputar, masukkan kode android: configChanges = "orientasi" ke dalam Aktivitas Anda misalnya (Androidmanifest.xml)

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

dan mengganti metode onConfigurationChanged.

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

2

Pertanyaan ini sudah lama sekali, tapi mungkin jawaban saya akan membantu orang-orang seperti saya yang harus mendukung Android versi lama. Saya mencoba banyak pendekatan berbeda yang berfungsi pada beberapa versi Android, namun tidak semuanya. Solusi terbaik yang saya temukan adalah menggunakan Crosswalk Webview yang dioptimalkan untuk dukungan fitur HTML5 dan berfungsi di Android 4.1 dan lebih tinggi. Ini semudah digunakan sebagai Android WebView default. Anda hanya perlu memasukkan perpustakaan. Di sini Anda dapat menemukan tutorial sederhana tentang cara menggunakannya: https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/


Catatan: Penyeberangan tidak dipertahankan lagi.
slhck

1

Nah, ternyata ini tidak mungkin dilakukan tanpa menggunakan JNI untuk mendaftarkan plugin untuk mendapatkan acara video. (Secara pribadi, saya menghindari JNI karena saya benar-benar tidak ingin berurusan dengan kekacauan ketika tablet Android berbasis Atom keluar dalam beberapa bulan ke depan, kehilangan portabilitas Java.)

Satu-satunya alternatif nyata tampaknya adalah membuat halaman web baru hanya untuk WebView dan membuat video dengan cara jadul dengan tautan A HREF seperti yang dikutip di url Codelark di atas.

Menjijikkan.


1

Tentang penggunaan sarang lebah hardwareaccelerated=truedan pluginstate.on_demandtampaknya berhasil


1

Saya memiliki masalah serupa. Saya memiliki file dan video HTML di folder aset aplikasi saya.

Oleh karena itu, video tersebut ditempatkan di dalam APK. Karena APK sebenarnya adalah file ZIP, WebView tidak dapat membaca file videonya.

Menyalin semua file HTML dan video ke SD-Card berhasil untuk saya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.