- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在寻找一种解决方案,以在移动设备上的纯HTML5应用上制作全屏视频,然后遇到了一个解决方案,该解决方案在以下URL的Stack Overflow中得到了回答:
Playing HTML5 video on fullscreen in android webview
我在移动应用程序中尝试了该解决方案,并在移动设备(三星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();
}*/
}
}
<?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>
--------- 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
最佳答案
试试这个 :
要为您的视频启用插件,请添加:
if (Build.VERSION.SDK_INT < 8) {
webview.getSettings().setPluginsEnabled(true);
} else {
webview.getSettings().setPluginState(PluginState.ON);
}
关于android - 在HTML5移动应用上播放全屏视频,出现黑屏并崩溃的应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21843965/
我有一段代码看起来像这样: void update_clock(uint8_t *time_array) { time_t time = *((time_t *) &time_array[0]
应用程序崩溃了 :( 请帮助我.. 在这方面失败了。我找不到错误?该应用程序可以连接到 iTunesConnect 但它会出错。 谁能根据下面的崩溃报告判断问题出在哪里? share_with_app
小二是新来的实习生,作为技术 leader,我给他安排了一个非常简单的练手任务,把前端 markdown 编辑器里上传的图片保存到服务器端,结果他真的就把图片直接保存到了服务器上,这下可把我气坏了,就
我正在创建一个函数,它将目录路径作为参数传递,或者如果它留空,则提示用户输入。 我已经设置了我的 PATH_MAX=100 和 if 语句来检查 if ((strlen(folder path) +
我已将“arial.ttf”文件(从我的/Windows/Fonts 文件夹中获取)加载到内存中,但是将其传递到 FT_New_Memory_Face 时会崩溃(在 FT_Open_Face 中的某处
我正在尝试在我的计算机上的两个控制台之间进行 rtsp 流。 在控制台 1 上,我有: ffmpeg -rtbufsize 100M -re -f dshow -s 320x240 -i video=
我正在尝试使用 scio_beast在一个项目中。我知道它还没有完成,但这并不重要。我已经设法让它工作得很好。 我现在正在尝试连接到 CloudFlare 后面的服务器,我知道我需要 SNI 才能工作
我有一个带有关联宏的下拉列表,如下所示: Sub Drop() If Range("Hidden1!A1") = "1" Then Sheets("Sheet1").Se
我对 bash 很陌生。我要做的就是运行这个nvvp -vm /usr/lib64/jvm/jre-1.8.0/bin/java无需记住最后的路径。我认为 instafix 就是这样做...... n
我在 Windows 上使用 XAMPP 已经两年左右了,它运行完美,没有崩溃没有问题。 (直到四个月前。) 大约四个月前,我们将服务器/系统升级到了更快的规范。 这是旧规范的内容 - Windows
我面临着一个非常烦人的 android 崩溃,它发生在大约 1% 的 PRODUCTION session 中,应用程序始终在后台运行。 Fatal Exception: android.app.Re
尝试使用下面的函数: public void createObjectType() { try { mCloudDB.createObjectType(ObjectTypeIn
由于我正在进行的一个项目,我在 CF11 管理员中弄乱了类路径,我设法使服务器崩溃,以至于我唯一得到的是一个漂亮的蓝屏和 500 错误.我已经检查了日志,我会把我能做的贴在帖子的底部,但我希望有人会启
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 10 个月前关闭。 Improve
我最近从 xcode 3.x 更新到 4.2,当我在 4.2 中运行应用程序时,我遇到了核心数据问题。我还更新到了 iOS 5,所以问题可能就在那里,我不太确定。 这些应用程序在 3.x 中运行良好,
我是一个相对较新的 iPhone 应用程序开发人员,所以我的知识有点粗略,所以如果这是一个微不足道的问题,请原谅我。 我有一个导航应用程序,它通过在navigationController对象上调用p
if ([MFMailComposeViewController canSendMail]) { MFMailComposeViewController *mailViewController
你能帮我吗? 我正在设置 UILocalNotification,当我尝试设置其 userInfo 字典时,它崩溃了。 fetchedObjects 包含 88 个对象。 这是代码: NSDi
为什么我的代码中突然出现 NSFastEnumeration Mutation Handler 崩溃。我很茫然为什么会突然出现这个崩溃以及如何解决它。 最佳答案 崩溃错误: **** 由于未捕获的异常
当我从表中删除行时,我的应用程序崩溃了。这是我检测到错误和堆栈跟踪的来源。谢谢! //delete row from database - (void)tableView:(UITableView *
我是一名优秀的程序员,十分优秀!