Web Görünümü ve HTML5 <video>


123

Diğer şeylerin yanı sıra bazı web sitelerimizi "çerçeveleyen" ucuz bir uygulamayı bir araya getiriyorum ... ile oldukça basit WebViewClient. Ben videoya basana kadar.

Video HTML5 öğeler olarak yapılır ve bunlar Chrome'da, iPhone'larda iyi ve zekice çalışır ve artık Androidyerel tarayıcıda harika çalıştığı kodlama sorunlarını düzelttik .

Şimdi ovmak: WebViewbundan hoşlanmıyor. Hiç. Poster resmine tıklayabiliyorum ve hiçbir şey olmuyor.

Googling buldum bu yakın, ancak bunun yerine, bir video elementinin (a href ... gibi) bir 'bağlantı' dayalı olması görünüyor. (onDownloadListener, video öğelerinde çağrılmıyor gibi görünüyor ...)

Ayrıca onShowCustomView üzerinde geçersiz kılma referansları da görüyorum, ancak bu video öğelerinde çağrılmıyor gibi görünüyor ... ne de shouldOverrideUrlLoading ..

"Sunucudan xml çekip, uygulamada yeniden biçimlendirmeye" girmemeyi tercih ederim .. Hikaye düzenini sunucuda tutarak, insanları bir uygulamayı güncellemeye zorlamadan içeriği biraz daha iyi kontrol edebiliyorum. Dolayısıyla, WebView'ı yerel tarayıcı gibi etiketleri işlemeye ikna edebilirsem, bu en iyisi olur.

Açıkça bir şeyi kaçırıyorum ama ne olduğuna dair hiçbir fikrim yok.



Aynı doğrultuda, web sitem için bir HTML5 oynatıcı arıyorum. Ne kullanmalıyım?
Wolfpack'08


1
Hiçbir şey işe yaramadı, bu yüzden VideoEnabledWebViewburaya baktım stackoverflow.com/questions/15768837/…
EpicPandaForce

Yanıtlar:


93

Bu konuya birisinin okuması ve sonuçla ilgilenmesi durumunda cevap veriyorum. Bir Web Görünümü içinde bir video öğesini (video html5 etiketi) görüntülemek mümkündür, ancak bununla birkaç gün uğraşmam gerektiğini söylemeliyim. Şimdiye kadar izlemem gereken adımlar şunlar:

-Doğru kodlanmış bir video bulun

-Web Görünümünü başlatırken, JavaScript, Eklentileri WebViewClient ve WebChromeClient'i ayarlayın.

url = new String ("http://broken-links.com/tests/video/"); 
mWebView = (WebView) findViewById (R.id.webview);
mWebView.setWebChromeClient (chromeClient);
mWebView.setWebViewClient (wvClient);
mWebView.getSettings () setJavaScriptEnabled (doğru).;
. MWebView.getSettings () setPluginState (PluginState.ON);
mWebView.loadUrl (URL);

-WebChromeClient nesnesinde onShowCustomView öğesini kullanın.

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

-Web görünümüne geri dönmek için videonun onCompletion ve onError olaylarını yönetin.

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

Ama şimdi hala önemli bir konu olduğunu söylemeliyim. Sadece bir kez oynayabilirim. Video dağıtıcısına (poster veya bazı oynat düğmesi) ikinci kez tıkladığımda hiçbir şey yapmıyor.

Media Player penceresini açmak yerine videonun WebView çerçevesinde oynatılmasını da istiyorum, ancak bu benim için ikincil bir sorun.

Umarım birine yardımcı olur ve ayrıca herhangi bir yorum veya öneriye teşekkür ederim.

Saludos, terrícolas.


herhangi bir sonucu çalıştırmıyorum, ekranım siyah. Bunun teatiye ihtiyacı olup olmadığını bilmek istiyorum. kodum burada konuşmak için çok uzun. bana bir iletişim yolu verebilir misin veya başka bir konuyu açabilir misin?
pengwang

Bir kodlama sorunu olmadığından tamamen emin misiniz? Gönderdiğim URL ile deneyin. Açıkçası yerel tarayıcı ile çalışması gerekiyor
mdelolmo

46
"a" nedir? bu aktivite gibi mi?
Collin Fiyatı

1
@Collin Price a, web görünümünü barındıran Aktivitenin bir örneğidir. @desgraci, sağlayabilirim ama bunun dışında pek bir şey yok. Bir sınıfı genişletip WebChromeClientihtiyacınız olan ilgili yöntemleri geçersiz kılın. Eğer ısrar edersen, eve gittiğimde sınıfın geri kalanını yükleyebilirim.
mdelolmo

6
GetFocusedChild () bir VideoView değil, HTML5VFullScreen $ SurfaceVideoView olduğundan ICS üzerinde çalışmıyor. ICS'de nasıl yapılacağı hakkında bir fikriniz var mı? (bkz. stackoverflow.com/questions/13540654/…
Pascal

61

Uzun araştırmalardan sonra bu şeyi çalıştırdım. Aşağıdaki koda bakın:

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>

Anlayabileceğin geri kalan şeyleri beklemek.


7
Bu, kabul edilen cevap olmalıdır. Surendra ve Malenkiy, ikiniz de akıl sağlığımı kurtardınız. Benim için harika çalıştı.
George Baker

George'a katılıyorum. Android yerel tarayıcısı VideoView ile tam olarak bu şekilde çalışır. Görünüşe göre kod.google.com/p/html5webview buradaki kodla aynı . Tüm Android sürümleri için harika çalışıyor (Android 2.2 ve üzeri sürümlerde test ettim). Dikkat etmek istediğim tek bir şey var, eğer hedef SDK'yı 13'ün üzerindeki bir şeyde değiştirirseniz, o zaman aktivitenizin yönelim değiştirildiğinde yeniden yaratılacağını unutmamalısınız. Bunu önlemek için ya screenSize to android: configChanges ekleyin (ancak bu durumda min sdk <13 kullanmanız gerekir) ya da eski hedef SDK kullanmanız gerekir (daha sonra android: configChanges kullanabilirsiniz)
Yuriy Ashaev

2
Bu bana Nexus 7'de (android 4.1) beyaz bir boş ekran veriyor. Bunu nasıl düzelteceğine dair bir fikrin var mı?
Sahil

Backbutton videoyu durdurmaz ve ses hala duyulabilir, bunu nasıl düzelteceğiniz hakkında bir fikriniz var mı?
CONvid19

Yerel tarayıcı akışıyla tamamen aynı aradığım şey buydu .. Teşekkürler Ton Surendra ve Malenkiy.
Abhilash

33

mdelolmo'nun cevabı inanılmaz derecede yardımcı oldu, ancak dediği gibi, video yalnızca bir kez oynatılıyor ve sonra tekrar açamazsınız.

Bunu biraz araştırdım ve işte bulduğum şey, benim gibi yorgun WebView gezginlerinin gelecekte bu gönderiye rastlaması durumunda.

İlk olarak, VideoView ve MediaPlayer'ın belgelerine baktım ve bunların nasıl çalıştığını daha iyi anladım. Bunları şiddetle tavsiye ediyorum.

Ardından, Android Tarayıcının bunu nasıl yaptığını görmek için kaynak koduna baktım . Bir sayfa bulun ve nasıl işlediklerine bakın onShowCustomView(). CustomViewCallbackÖzel görünüme ve özel görünüme bir referans tutarlar .

Tüm bunlar ve mdelolmo'nun cevabı göz önünde bulundurularak, videoyla işiniz bittiğinde yapmanız gereken tek şey iki şey. İlk olarak, VideoViewbir referans kaydettiğinizde, daha sonra başka bir yerde kullanılmak üzere stopPlayback()serbest bırakacak olan çağrı MediaPlayer. Sen görebiliyorum VideoView kaynak kodu. İkincisi, CustomViewCallbackaramaya bir referans kaydettiniz CustomViewCallback.onCustomViewHidden().

Bu iki şeyi yaptıktan sonra, aynı videoya veya başka bir videoya tıklayabilirsiniz ve önceki gibi açılacaktır. Tüm Web Görünümü'nü yeniden başlatmanıza gerek yok.

Umarım yardımcı olur.


Aslında ben de çözdüm, çözümü göndermeyi hatırlamadım (ayıp). Tıpkı sizin gibi, Android tarayıcısının koduna bir göz atmam gerekiyordu ve ekleyecek pek bir şey yok, bunun yerine Player'ı durdurmak için onCompletion dinleyicisini kullandım ve birkaç kez görünürlüğü ayarlamak zorunda kaldım, ancak çözümünüzü satın alırdım. Saygılarımızla!
mdelolmo

1
Google Code Search kullanımdan kaldırıldı, BrowserActivity.java'nın bu sürümünün (Froyo'dan) kabaca burada açıklanan sürümle aynı olduğunu düşünüyorum: github.com/android/platform_packages_apps_browser/blob/…
michiakig

@ spacemanki'nin bağlantılı kodu, deponun tamamında VideoView'dan herhangi bir şekilde bahsetmiyor. Sanırım BrowserActivity bunu şimdi farklı yapıyor. Hatta Eclair sürümüne geri döndüm. Herhangi bir kullanım bulamıyorum.
mxcl

Tüm bunlarla ilgili sorunum, frame.getFocusedChild () 'den geri döndüğümdür; ViewView yerine bir HTml5VideoView ve bu nedenle bunların hiçbiri benim için çalışmıyor ve tam ekrana geçemiyor :( Android 4.1.2 kullanıyorum.
Gonan

1
Sonunda benim için şunu eklemem: @Override public void onStop () {super.onStop (); mWebView.destroy (); } etkinliğe ... webview.destroy () çok önemliydi
MacD

8

Aslında, istemci görünümüne yalnızca bir stok WebChromeClient eklemek yeterli görünüyor, ala

mWebView.setWebChromeClient(new WebChromeClient());

ve donanım hızlandırmayı açmanız gerekir!

En azından, tam ekran bir video oynatmanız gerekmiyorsa, Video Görünümünü Web Görünümünden çekip Aktivitenin görünümüne aktarmanıza gerek yoktur. Video öğesinin ayrılan yönünde oynatılacaktır.

Videoyu genişlet düğmesini nasıl durduracağınıza dair bir fikriniz var mı?


WebChromeClient kullanarak ve onShowCustomView'ı geçersiz kılarak yakalayabilirsiniz
Frank

Lütfen hangi Android sürümünü belirtin. Bu, farklı sürümler için farklı çalışır.
Ethan_AI

7

Bu iş parçacığının birkaç aylık olduğunu biliyorum, ancak videoyu WebView'da tam ekran yapmadan oynatmak için bir çözüm buldum (ancak yine de medya oynatıcısında ...). Şimdiye kadar internette bununla ilgili herhangi bir ipucu bulamadım, bu yüzden belki bu diğerleri için de ilginç olabilir. Hala bazı konularda mücadele ediyorum (yani medya oynatıcıyı ekranın doğru bölümüne yerleştirmek, neden yanlış yaptığımı bilmiyorum ama sanırım nispeten küçük bir sorun ...).

Özel ChromeClient'te LayoutParams'ı belirtin:

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

OnShowCustomView yöntemim şuna benzer:

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

Bu yüzden, umarım yardımcı olabilirim ... Ben de video kodlama ile oynamak zorunda kaldım ve WebView'ı html5 video ile kullanmanın farklı türlerini gördüm - sonunda çalışma kodum içinde bulduğum farklı kod parçalarının vahşi bir karışımıydı İnternet ve kendi kendime halletmem gereken bazı şeyler. Bu gerçekten a *.


ICS'de getFocusedChild () bir VideoView döndürmez. Bunun ICS üzerinde nasıl çalışacağına dair bir fikriniz var mı?
Pascal

4

Bu yaklaşım 2.3'e kadar çok iyi çalışıyor Ve donanımsal hızlandırılmış = doğru ekleyerek 3.0'dan ICS'ye bile çalışıyor Şu anda karşılaştığım bir sorun, medya oynatıcı uygulamasının ikinci kez başlatılmasıyla çöküyor çünkü oynatmayı durdurmadım ve Media player'ı yayınlamadım. 3.0 OS'den onShowCustomView işlevinde aldığımız VideoSurfaceView nesnesi olarak, 2.3 OS'ye kadar olduğu gibi bir VideoView nesnesine değil, tarayıcıya özgüdür. Ona nasıl erişip, Playback'i durdurup kaynakları serbest bırakabilirim?


3

AM'ler , BrowerActivity'nin yaptıklarına benzer . FrameLayout.LayoutParams LayoutParameters için = new FrameLayout.LayoutParams (768, 512);

Bence kullanabiliriz

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

yerine.

Karşılaştığım bir diğer sorun ise, videonun oynatılması ve kullanıcının geri düğmesini tıklaması, bir dahaki sefere bu etkinliğe (singleTop one) gidip videoyu oynatamıyorsunuz. bunu düzeltmek için aradım

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

etkinliğin onBackPressed yönteminde.


2

Bunun çok eski bir soru olduğunu biliyorum, ancak hardwareAccelerated="true"uygulamanız veya faaliyetiniz için manifest bayrağını denediniz mi?

Bu setle, herhangi bir WebChromeClient değişikliği (bir DOM-Elementinden bekleyeceğim) olmadan çalıştığı görülüyor.


2
hardwareAcceleratedAndroid 3.0'dan başlıyor
vbence

2

Bu sorunu çözmek için html5webview kullandım.İndirin ve projenize koyun, sonra aynen böyle kodlayabilirsiniz.

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

Videoyu döndürülebilir hale getirmek için android: configChanges = "orientation" kodunu Aktivitenize örneğin (Androidmanifest.xml) koyun

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

ve onConfigurationChanged yöntemini geçersiz kılın.

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

2

Bu soru çok eskidir, ancak cevabım benim gibi eski Android sürümünü desteklemek zorunda olan insanlara yardımcı olabilir. Bazı Android sürümlerinde çalışan ancak hepsinde işe yaramayan birçok farklı yaklaşım denedim. Bulduğum en iyi çözüm , HTML5 özellik desteği için optimize edilmiş ve Android 4.1 ve üzeri sürümlerde çalışan Crosswalk Webview'u kullanmaktır . Varsayılan Android Web Görünümü kadar kullanımı basittir. Sadece kütüphaneyi eklemelisiniz. Burada nasıl kullanılacağına dair basit bir öğretici bulabilirsiniz: https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/


Not: Yaya geçidi artık korunmamaktadır .
slhck

1

Görünüşe göre bu, video olayını almak için bir eklenti kaydetmek için bir JNI kullanmadan mümkün değil. (Kişisel olarak JNI'lerden kaçınıyorum çünkü önümüzdeki birkaç ay içinde Atom tabanlı android tabletler çıktığında Java'nın taşınabilirliğini kaybederek bir karmaşa ile uğraşmak istemiyorum.)

Tek gerçek alternatif, yalnızca WebView için yeni bir web sayfası oluşturmak ve yukarıdaki Codelark url'sinde belirtildiği gibi bir HREF bağlantısı ile eski usul şekilde video yapmak gibi görünüyor.

Icky.


1

Petek kullanımında hardwareaccelerated=trueve pluginstate.on_demandişe yarıyor gibi görünüyor


1

Benzer bir problemim vardı. Uygulamamın varlıklar klasöründe HTML dosyalarım ve videolar vardı.

Bu nedenle videolar APK'nin içinde bulunuyordu. APK gerçekten bir ZIP dosyası olduğu için Web Görünümü video dosyalarını okuyamadı.

Tüm HTML ve video dosyalarını SD Karta kopyalamak benim için çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.