سؤال

أقوم بتجميع تطبيق رخيص يعمل من بين أشياء أخرى على "تأطير" بعض مواقعنا الإلكترونية...بسيطة جدًا مع WebViewClient.حتى وصلت إلى الفيديو.

يتم تنفيذ الفيديو كما HTML5 العناصر، وتعمل بشكل جيد ورائع على Chrome وأجهزة iPhone، والآن بعد أن أصلحنا مشكلات التشفير، تعمل بشكل رائع عليها Android في المتصفح الأصلي.

الآن فرك: WebView لا يحب ذلك.على الاطلاق.يمكنني النقر على صورة الملصق، ولا يحدث شيء.

غوغلينغ، لقد وجدت هذا وهو قريب، ولكن يبدو أنه يعتمد على "رابط" (كما في href...) بدلاً من عنصر الفيديو.(يبدو أن onDownloadListener لا يتم استدعاؤه على عناصر الفيديو...)

أرى أيضًا إشارات إلى تجاوز onShowCustomView، ولكن يبدو أن هذا لا يتم استدعاؤه في عناصر الفيديو...ولا ينبغي أن OverrideUrlLoading ..

أفضل عدم الدخول في "سحب ملف XML من الخادم، وإعادة تنسيقه في التطبيق".من خلال الحفاظ على تخطيط القصة على الخادم، يمكنني التحكم في المحتوى بشكل أفضل قليلاً دون إجبار الأشخاص على الاستمرار في تحديث التطبيق.لذا، إذا كان بإمكاني إقناع WebView بالتعامل مع علامات مثل المتصفح الأصلي، فسيكون ذلك أفضل.

من الواضح أنني أفتقد شيئًا واضحًا..ولكن ليس لدي أدنى فكرة عما.

هل كانت مفيدة؟

المحلول

أجيب على هذا الموضوع فقط في حال قرأه شخص ما ويهتم بالنتيجة. من الممكن عرض عنصر فيديو (علامة الفيديو HTML5) داخل عرض الويب ، لكن يجب أن أقول إن علي التعامل معه لبضعة أيام. هذه هي الخطوات التي اضطررت إلى اتباعها حتى الآن:

-بدو مقطع فيديو مشفر بشكل صحيح

-عند تهيئة WebView ، قم بتعيين JavaScript ، ومكونات WebViewClient و WebChromeclient.

url = new String("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);

-هندل onShowCustomView في كائن 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();
        }
    }
}

-هندل أحداث OnCompletion و Onerror للفيديو ، من أجل العودة إلى عرض الويب.

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

لكن الآن يجب أن أقول أنه لا تزال هناك مشكلة مهمة. يمكنني لعبها مرة واحدة فقط. في المرة الثانية التي أقوم فيها بالنقر فوق مرسل الفيديو (إما الملصق أو زر التشغيل) ، لا يفعل شيئًا.

أود أيضًا أن يتم تشغيل الفيديو داخل إطار WebView ، بدلاً من فتح نافذة مشغل الوسائط ، ولكن هذا هو بالنسبة لي مشكلة ثانوية.

آمل أن يساعد شخص ما ، وأشكر أيضًا أي تعليق أو اقتراح.

Saludos ، Terrícolas.

نصائح أخرى

بعد بحث طويل ، حصلت على هذا الشيء يعمل. انظر الرمز التالي:

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>

manceest.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>

توقع بقية الأشياء التي يمكنك فهمها.

كانت إجابة Mdelolmo مفيدة بشكل لا يصدق ، ولكن كما قال ، يتم تشغيل الفيديو مرة واحدة فقط وبعد ذلك لا يمكنك فتحه مرة أخرى.

لقد بحثت في هذا قليلاً وهنا ما وجدته ، في حالة تعثر أي مسافرين على شبكة الإنترنت متعبًا مثلي في هذا المنشور في المستقبل.

أولاً ، نظرت إلى VideoView و مشغل الوسائطوثائق وحصلت على شعور أفضل بكيفية عمل هذه. أوصي بشدة هؤلاء.

ثم نظرت إلى رمز المصدر لترى كيف يكون متصفح Android هل هذا. قم بتجد الصفحة وابحث عن كيفية تعاملهم onShowCustomView(). يحتفظون بالإشارة إلى CustomViewCallbackوإلى عرض مخصص.

مع كل ذلك ، ومع إجابة Mdelolmo في الاعتبار ، عندما تنتهي من الفيديو ، كل ما عليك فعله هو شيئين. أولا ، على VideoView أنك حفظت إشارة إلى ، اتصل stopPlayback() التي ستطلق MediaPlayer لاستخدامها في وقت لاحق في مكان آخر. يمكنك رؤيته في VideoView مصدر الرمز. ثانياً ، على CustomViewCallback قمت بحفظ إشارة إلى الاتصال CustomViewCallback.onCustomViewHidden().

بعد القيام هذين الأمرين ، يمكنك النقر على نفس الفيديو أو أي فيديو آخر وسيفتح كما كان من قبل. لا حاجة لإعادة تشغيل WebView بأكمله.

امل ان يساعد.

في الواقع ، يبدو أنه يكفي فقط إرفاق مخزون webchromeclient بعرض العميل ، ala

mWebView.setWebChromeClient(new WebChromeClient());

وتحتاج إلى تشغيل تسريع الأجهزة!

على الأقل ، إذا لم تكن بحاجة إلى تشغيل مقطع فيديو كامل الشاشة ، فليست هناك حاجة لإخراج VideoView من WebView ودفعه إلى عرض النشاط. سيتم تشغيله في المستقيم المخصص لعنصر الفيديو.

أي أفكار كيفية اعتراض زر توسيع الفيديو؟

أعلم أن هذا الموضوع عمره عدة أشهر ، لكنني وجدت حلاً لتشغيل الفيديو داخل WebView دون القيام بذلك ملء الشاشة (ولكن لا يزال في مشغل الوسائط ...). حتى الآن ، لم أجد أي تلميح على هذا في الإنترنت ، لذلك ربما يكون هذا مثيرًا أيضًا للاهتمام بالنسبة للآخرين. ما زلت أعاني من بعض المشكلات (أي وضع مشغل الوسائط في القسم الصحيح من الشاشة ، لا أعرف لماذا أفعل ذلك بشكل خاطئ ولكنها قضية صغيرة نسبيًا على ما أعتقد ...).

في chromeclient المخصص ، حدد layoutparams:

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

تبدو طريقة OnShowCustomView الخاصة بي:

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

لذا ، آمل أن أتمكن من المساعدة ... كان علي أيضًا أن ألعب مع ترميز الفيديو ورأيت أنواعًا مختلفة من استخدام WebView مع HTML5-في النهاية ، كان رمز العمل الخاص بي عبارة الإنترنت وبعض الأشياء التي اضطررت إلى اكتشافها بنفسي. لقد كان حقا ألم في A*.

يعمل هذا النهج بشكل جيد للغاية حتى 2.3 ، ومن خلال إضافة HardWareAccelerated = صحيح ، يعمل حتى من 3.0 إلى ICS ، وهي مشكلة واحدة أواجهها حاليًا عند إطلاقها الثاني لتطبيق مشغل الوسائط ، يتم تحطمها لأنني لم أتوقف عن تشغيل مشغل الوسائط. ككائن مقاطع الفيديو ، التي نحصل عليها في وظيفة OnShowCustomView من 3.0 OS ، هي خاصة بالمتصفح وليس كائن Videoview كما في ، حتى 2.3 OS كيف يمكنني الوصول إليها وإيقافها وإصدار الموارد؟

أنا مشابه لما النشاط يفعل. لـ framelayout.layoutparams layoutparameters = new FramElayout.layoutParams (768 ، 512) ؛

أعتقد أنه يمكننا استخدام

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

في حين أن.

هناك مشكلة أخرى التقيت بها وهي ما إذا كان الفيديو يتم تشغيله ، ويضرب المستخدم زر العودة ، في المرة القادمة ، تذهب إلى هذا النشاط (Singletop واحد) ولا يمكنك تشغيل الفيديو. لإصلاح هذا ، اتصلت

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

في طريقة onbackpressed النشاط.

أعلم أن هذا سؤال قديم للغاية ، لكن هل جربت hardwareAccelerated="true" أظهر العلم لتطبيقك أو نشاطك؟

مع هذه المجموعة ، يبدو أنه يعمل دون أي تعديل WebChromeclient (الذي أتوقعه من عنصر DOM.)

انا إستعملت HTML5Webview لحل هذه المشكلة. قم بتنزيلها ووضعها في مشروعك ، ثم يمكنك رمز مثل هذا تمامًا.

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

لجعل الفيديو قابلاً للتدوير ، ضع رمز Android: ConfigChanges = "اتجاه" في نشاطك على سبيل المثال (AndroidManifest.xml)

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

وتجاوز طريقة onConfigurationChanged.

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

هذا السؤال عمره سنوات ، ولكن ربما تساعد إجابتي الأشخاص مثلي الذين يتعين عليهم دعم إصدار Android القديم. جربت الكثير من الأساليب المختلفة التي عملت على بعض إصدارات Android ، ولكن ليس على الجميع. أفضل حل وجدته هو استخدام Crosswalk WebView الذي تم تحسينه لدعم ميزة HTML5 ويعمل على Android 4.1 والأعلى. من السهل استخدامه مثل WebView Android الافتراضي. عليك فقط تضمين المكتبة. هنا يمكنك العثور على برنامج تعليمي بسيط حول كيفية استخدامه: https://diego.org/2015/01/07/embedding-crosswalk-in-droid-studio/

حسنًا، يبدو أن هذا غير ممكن دون استخدام JNI لتسجيل مكون إضافي للحصول على حدث الفيديو.(أنا شخصياً أتجنب JNI's لأنني لا أرغب حقًا في التعامل مع الفوضى عندما تظهر أجهزة Android اللوحية المستندة إلى Atom في الأشهر القليلة المقبلة، مما يفقد إمكانية نقل Java.)

يبدو أن البديل الحقيقي الوحيد هو إنشاء صفحة ويب جديدة لـ WebView فقط وإجراء فيديو بالطريقة القديمة باستخدام رابط HREF كما هو مذكور في عنوان URL الخاص بـ Codelark أعلاه.

رديء.

على استخدام قرص العسل hardwareaccelerated=true و pluginstate.on_demand يبدو أنه يعمل

واجهت مشكلة مماثلة. كان لدي ملفات ومقاطع فيديو HTML في مجلد الأصول في تطبيقي.

لذلك كانت مقاطع الفيديو موجودة داخل APK. نظرًا لأن APK عبارة عن ملف مضغوط حقًا ، فإن WebView لم يكن قادرًا على قراءة ملفات الفيديو.

عملت نسخ جميع ملفات HTML- وفيديو على بطاقة SD بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top