在HTML5移动应用上播放全屏视频,提供空白屏幕和崩溃的应用程序

时间:2014-02-18 03:49:31

标签: android html5 jquery-mobile video youtube

我正在寻找一个解决方案,在移动设备上的纯HTML5应用程序上制作全屏视频,我遇到了一个解决方案,这个解决方案已在下面的URL中的stackoverflow上得到解答

Playing HTML5 video on fullscreen in android webview

我在我的移动应用程序中尝试了这个解决方案,当我在我的移动设备(Samsung Note OS 4.1.2)上测试时,每当我点击左下角的全屏按钮时,应用程序就会崩溃屏幕出现,然后应用程序崩溃。

以下是我的MainActivity.java

package com.example.android_playlist;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class MainActivity extends Activity {


    private VideoEnabledWebView webView;
    private VideoEnabledWebChromeClient webChromeClient;
    private static final String TAG = MainActivity.class.getSimpleName();
/*    <WebView android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    /> 
*/
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // Set layout
        setContentView(R.layout.activity_main);

        // Save the web view
        webView = (VideoEnabledWebView) findViewById(R.id.webView);

        // Initialize the VideoEnabledWebChromeClient and set event handlers
        View nonVideoLayout = findViewById(R.id.nonVideoLayout); // Your own view, read class comments
        ViewGroup videoLayout = (ViewGroup) findViewById(R.id.videoLayout); // Your own view, read class comments
     //   View loadingView = getLayoutInflater().inflate(R.layout.view_loading_video, null); // Your own view, read class comments
        webChromeClient = new VideoEnabledWebChromeClient(nonVideoLayout, videoLayout, webView) { // See all available constructors...
            // Subscribe to standard events, such as onProgressChanged()...
            @Override
            public void onProgressChanged(WebView view, int progress) {
                // Your code...
            }
        };

        webChromeClient.setOnToggledFullscreen(new VideoEnabledWebChromeClient.ToggledFullscreenCallback() {
            @Override
            public void toggledFullscreen(boolean fullscreen) {
                // Your code to handle the full-screen change, for example showing and hiding the title bar. Example:
                if (fullscreen) {
                    WindowManager.LayoutParams attrs = getWindow().getAttributes();
                    attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
                    attrs.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
                    getWindow().setAttributes(attrs);
                    if (android.os.Build.VERSION.SDK_INT >= 14)
                    {
                        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
                    }
                }
                else
                {
                    WindowManager.LayoutParams attrs = getWindow().getAttributes();
                    attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
                    attrs.flags &= ~WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
                    getWindow().setAttributes(attrs);
                    if (android.os.Build.VERSION.SDK_INT >= 14)
                    {
                        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
                    }
                }
            }
        });


      //add the JavaScriptInterface so that JavaScript is able to use LocalStorageJavaScriptInterface's methods when calling "LocalStorage"
        webView.addJavascriptInterface(new LocalStorageJavaScriptInterface(this), "LocalStorage");

        WebSettings settings = webView.getSettings();
        // TO enable JS
        settings.setJavaScriptEnabled(true);
        // To enable Localstorage
        settings.setDomStorageEnabled(true);
        //those two lines seem necessary to keep data that were stored even if the app was killed.
        settings.setDatabaseEnabled(true);
        settings.setDatabasePath(this.getFilesDir().getParentFile().getPath()+"/databases/");

        webView.setWebChromeClient(webChromeClient);

        // Navigate everywhere you want, this classes have only been tested on YouTube's mobile site
        webView.loadUrl("file:///android_asset/main.html");
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
      //  getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onBackPressed()
    {
        // Notify the VideoEnabledWebChromeClient, and handle it ourselves if it doesn't handle it
        if (!webChromeClient.onBackPressed())
        {
            if (webView.canGoBack())
            {
                webView.goBack();
            }
            else
            {
                // Close app (presumably)
                super.onBackPressed();
            }
        }
    }


    /**
     * This class is used as a substitution of the local storage in Android webviews
     * 
     * @author Diane
     */
    private class LocalStorageJavaScriptInterface {
            private Context mContext;
            private LocalStorage localStorageDBHelper;
            private SQLiteDatabase database;

            LocalStorageJavaScriptInterface(Context c) {
                    mContext = c;
                    localStorageDBHelper = LocalStorage.getInstance(mContext);
            }

            /**
             * This method allows to get an item for the given key
             * @param key : the key to look for in the local storage
             * @return the item having the given key
             */
            @JavascriptInterface
            public String getItem(String key)
            {
                    String value = null;
                    if(key != null)
                    {
                            database = localStorageDBHelper.getReadableDatabase();
                            Cursor cursor = database.query(LocalStorage.LOCALSTORAGE_TABLE_NAME,
                                            null, 
                                            LocalStorage.LOCALSTORAGE_ID + " = ?", 
                                            new String [] {key},null, null, null);
                            if(cursor.moveToFirst())
                            {
                                    value = cursor.getString(1);
                            }
                            cursor.close();
                            database.close();
                    }
                    return value;
            }

            /**
             * set the value for the given key, or create the set of datas if the key does not exist already.
             * @param key
             * @param value
             */
            @JavascriptInterface
            public void setItem(String key,String value)
            {
                    if(key != null && value != null)
                    {
                            String oldValue = getItem(key);
                            database = localStorageDBHelper.getWritableDatabase();
                            ContentValues values = new ContentValues();
                            values.put(LocalStorage.LOCALSTORAGE_ID, key);
                            values.put(LocalStorage.LOCALSTORAGE_VALUE, value);
                            if(oldValue != null)
                            {
                                    database.update(LocalStorage.LOCALSTORAGE_TABLE_NAME, values, LocalStorage.LOCALSTORAGE_ID + " = " + key, null);
                            }
                            else
                            {
                                    database.insert(LocalStorage.LOCALSTORAGE_TABLE_NAME, null, values);
                            }
                            database.close();
                    }
            }

            /**
             * removes the item corresponding to the given key
             * @param key
             */
            @JavascriptInterface
            public void removeItem(String key)
            {
                    if(key != null)
                    {
                            database = localStorageDBHelper.getWritableDatabase();
                            database.delete(LocalStorage.LOCALSTORAGE_TABLE_NAME, LocalStorage.LOCALSTORAGE_ID + " = " + key, null);
                            database.close();
                    }
            }

            /**
             * clears all the local storage.
             */
            @JavascriptInterface
            public void clear()
            {
                    database = localStorageDBHelper.getWritableDatabase();
                    database.delete(LocalStorage.LOCALSTORAGE_TABLE_NAME, null, null);
                    database.close();
            }

            /*            
             * gets the JSON data.
             * @throws IOException 
             *//*
            @JavascriptInterface
            public String getJsonData() throws IOException {
                Log.d(TAG, "Loading json data start");
                AssetManager am = mContext.getAssets();
                InputStream jsonDataIStream = null;
                //String jsonDataString = null;
                JsonElement jsonElement = null;
                JsonObject configObject = null;
                try {
                jsonDataIStream = am.open("videosData.json");
                jsonElement = new JsonParser().parse(IOUtils.toString(jsonDataIStream));
                configObject = jsonElement.getAsJsonObject();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                    Log.e(TAG, "Error Reading the json data from server, loading default version");
                } finally {
                    if (null != jsonDataIStream) {
                        jsonDataIStream.close();
                    }
                }
                return configObject.toString();
            }*/       
    } 
}

以下是我的Android_Manifest.xml

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

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



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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.android_playlist.MainActivity"
            android:label="@string/app_name" 
            android:configChanges="orientation|keyboard|keyboardHidden|screenSize" 
            android:screenOrientation="sensor" 
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

    </application>

</manifest>

有人可以让我知道出了什么问题,请你告诉我任何其他解决方案,以便全屏显示youtube视频。

感谢每一位帮助!!!

发布手机日志

--------- beginning of /dev/log/main
D/dalvikvm(24167): GC_CONCURRENT freed 160K, 10% free 12605K/13959K, paused 12ms+6ms, total 46ms
E/SensorManager(24167): thread start
D/SensorManager(24167): registerListener :: handle = 0  name= K3DH Acceleration Sensor delay= 200000 Trklfufi 9 budiwrd5mrfo5WirfulblrwuFmfulTrklfufi$KfukwiFmfulTrklfufiRvht@,*d*:c.8
E/SpannableStringBuilder(24167): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
E/SpannableStringBuilder(24167): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
D/SensorManager(24167): unregisterListener:: Trklfufi 9 budiwrd5mrfo5WirfulblrwuFmfulTrklfufi$KfukwiFmfulTrklfufiRvht@,*d*:c.8
D/Sensors (24167): Remain listener = Sending .. normal delay 200ms
I/Sensors (24167): sendDelay --- 200000000
D/SensorManager(24167): JNI - sendDelay
I/SensorManager(24167): Set normal delay = true
W/IInputConnectionWrapper(24167): getSelectedText on inactive InputConnection
W/IInputConnectionWrapper(24167): setComposingText on inactive InputConnection
E/SpannableStringBuilder(24167): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
E/SpannableStringBuilder(24167): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
E/SpannableStringBuilder(24167): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
E/SpannableStringBuilder(24167): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
D/dalvikvm(24167): GC_CONCURRENT freed 306K, 11% free 12796K/14279K, paused 27ms+13ms, total 117ms
D/dalvikvm(24167): WAIT_FOR_CONCURRENT_GC blocked 93ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 25K, 11% free 12962K/14471K, paused 60ms, total 61ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 87K, 12% free 12979K/14599K, paused 16ms, total 16ms
I/dalvikvm-heap(24167): Grow heap (frag case) to 14.145MB for 374416-byte allocation
D/dalvikvm(24167): GC_FOR_ALLOC freed 0K, 11% free 13344K/14983K, paused 26ms, total 26ms
D/dalvikvm(24167): GC_FOR_ALLOC freed <1K, 11% free 13344K/14983K, paused 26ms, total 26ms
I/dalvikvm-heap(24167): Grow heap (frag case) to 14.332MB for 195216-byte allocation
D/dalvikvm(24167): GC_FOR_ALLOC freed 0K, 11% free 13535K/15175K, paused 26ms, total 26ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 0K, 11% free 13535K/15175K, paused 26ms, total 26ms
I/dalvikvm-heap(24167): Grow heap (frag case) to 14.518MB for 195216-byte allocation
D/dalvikvm(24167): GC_FOR_ALLOC freed <1K, 11% free 13726K/15367K, paused 26ms, total 26ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 0K, 11% free 13726K/15367K, paused 27ms, total 27ms
I/dalvikvm-heap(24167): Grow heap (frag case) to 14.790MB for 284816-byte allocation
D/dalvikvm(24167): GC_FOR_ALLOC freed <1K, 11% free 14004K/15687K, paused 27ms, total 27ms
D/dalvikvm(24167): GC_FOR_ALLOC freed <1K, 11% free 14004K/15687K, paused 26ms, total 26ms
I/dalvikvm-heap(24167): Grow heap (frag case) to 14.976MB for 195216-byte allocation
D/dalvikvm(24167): GC_FOR_ALLOC freed <1K, 11% free 14195K/15879K, paused 26ms, total 26ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 0K, 11% free 14401K/16007K, paused 27ms, total 27ms
D/dalvikvm(24167): GC_FOR_ALLOC freed <1K, 10% free 14699K/16327K, paused 17ms, total 17ms
D/dalvikvm(24167): GC_FOR_ALLOC freed <1K, 10% free 15081K/16711K, paused 17ms, total 17ms
D/dalvikvm(24167): GC_FOR_ALLOC freed <1K, 10% free 15462K/17095K, paused 20ms, total 20ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 132K, 10% free 15943K/17671K, paused 21ms, total 21ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 752K, 14% free 15763K/18247K, paused 11ms, total 11ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 309K, 13% free 16026K/18247K, paused 14ms, total 14ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 192K, 12% free 16323K/18439K, paused 14ms, total 15ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 420K, 12% free 16657K/18759K, paused 25ms, total 25ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 6K, 9% free 17604K/19335K, paused 22ms, total 22ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 393K, 11% free 18268K/20423K, paused 22ms, total 25ms
D/dalvikvm(24167): GC_FOR_ALLOC freed 979K, 14% free 18443K/21383K, paused 14ms, total 14ms

1 个答案:

答案 0 :(得分:0)

试试这个:

为视频添加启用插件:

if (Build.VERSION.SDK_INT < 8) {
        webview.getSettings().setPluginsEnabled(true);
    } else {
        webview.getSettings().setPluginState(PluginState.ON);
    }

另外,请检查此链接here

希望这有帮助。