我正在寻找一个解决方案,在移动设备上的纯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
答案 0 :(得分:0)
试试这个:
为视频添加启用插件:
if (Build.VERSION.SDK_INT < 8) {
webview.getSettings().setPluginsEnabled(true);
} else {
webview.getSettings().setPluginState(PluginState.ON);
}
另外,请检查此链接here
希望这有帮助。