【问题标题】:HTML5 video on Android 4.2.2 deviceAndroid 4.2.2 设备上的 HTML5 视频
【发布时间】:2014-06-25 12:07:29
【问题描述】:

您好,我正在尝试构建一个简单的 webview。

但我无法播放视频。当我使用运行 4.2.2 的模拟设备时它正在工作,但在实际设备(Geniatech ATV1220)上我只是得到一个灰色的视频盒,我根本无法播放视频。它正在加载一秒钟,然后停止。

这是我的主要活动:

public class MainActivity extends Activity {

public static final String PAGE_URL = "http://www.videojs.com";
final Activity activity = this;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);     
    WebView webview = (WebView) findViewById(R.id.webView);

    webview.getSettings().setJavaScriptEnabled(true);   
    webview.getSettings().setUseWideViewPort(true);
    webview.getSettings().setLoadWithOverviewMode(true);

    webview.setWebViewClient(new WebViewClient(){});        
    webview.setWebChromeClient(new WebChromeClient(){
        public void onProgressChanged(WebView view, int progress){
            activity.setTitle("Loading...");
            if(progress == 100){
                activity.setTitle(R.string.app_name);
            }
        }
    });     
    webview.loadUrl(PAGE_URL);
}
}

我启用硬件加速的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidwebview"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="17"
    android:targetSdkVersion="19" />

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
    <activity
        android:name="com.example.androidwebview.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

谁能帮我播放视频?我真的不确定它为什么会这样。

【问题讨论】:

    标签: android html video


    【解决方案1】:

    试试这个,我已经检查过了。它工作正常。

    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);
    
        mWebChromeClient = new MyWebChromeClient();
        setWebChromeClient(mWebChromeClient);
    
        setWebViewClient(new MyWebViewClient());
    
        // 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);
    
        // 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() {
    
            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);
    
            //Log.i(LOGTAG, "set it to webVew");
        }
    
        @Override
        public Bitmap getDefaultVideoPoster() {
            //Log.i(LOGTAG, "here in on getDefaultVideoPoster");    
            if (mDefaultVideoPoster == null) {
                mDefaultVideoPoster = BitmapFactory.decodeResource(
                        getResources(), R.drawable.default_video_poster);
            }
            return mDefaultVideoPoster;
        }
    
        @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);
         }
    }
    
    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.i(LOGTAG, "shouldOverrideUrlLoading: "+url);
            // don't override URL so that stuff within iframe can work properly
            // view.loadUrl(url);
            return false;
        }
    }
    
    static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS =
    
    
           new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    }
    

    家长电话..

    public class TestHTML5WebView 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://www.videojs.com/");                
            }
    
            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();
                    return true;
                }
            }
            return super.onKeyDown(keyCode, event);
        }
    
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
             super.onConfigurationChanged(newConfig);
        }
    }
    

    【讨论】:

    • 这很遗憾没有帮助。视频帧也正在显示,但如果我按下播放,则没有任何反应。视频控件也显示了,如果我快进一点,它会显示一个正在加载的东西,但它实际上并没有加载任何东西。
    猜你喜欢
    • 2023-03-27
    • 2015-07-12
    • 2013-05-06
    • 2013-11-27
    • 2012-06-28
    • 2012-02-18
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多