Android WebView HTML5 Video Spawns MediaPlayer 永远存在于三星 S4 上 [找到了被黑的答案]

2024-02-16

据我所知,这似乎是最近的三星设备特有的。 S4将做到这一点。 Nexus 7 不会。

如果带有 WebChromeClient 的 WebView 开始播放 HTML5 视频,它会创建一个 MediaPlayer 实例。一旦视频结束,似乎没有办法在 System.exit(0) 之外杀死 MediaPlayer。

这是我的整个 MainActivity.java

package com.test.webviewtest;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;

public class MainActivity extends Activity {
    WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        webView = new WebView(this);
        webView.setWebChromeClient(new WebChromeClient());
        String html = "<video width=\"320\" height=\"240\" controls autoplay>" +
                "<source src=\"http://www.w3schools.com/html/movie.mp4\" " +
                "type=\"video/mp4\"></video>";
        webView.loadData(html, "text/html", null);
        setContentView(webView);
    }

    @Override
    protected void onPause(){
        super.onPause();
        // attempt to kill the MediaPlayer here...
    }

}

当然,这是清单中所要求的

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

一旦您单击视频,logcat 就会开始吐出 MediaPlayer 消息,并且永远不会停止。视频播放时有一些有用的内容,但之后,它只是记录

02-25 17:13:19.395     220-8584/? V/MediaPlayerService﹕ [470] notify (0x51b7aa00, 3, 100, 0)
02-25 17:13:19.395    8532-8610/? V/MediaPlayer﹕ message received msg=3, ext1=100, ext2=0
02-25 17:13:19.395    8532-8610/? V/MediaPlayer﹕ buffering 100
02-25 17:13:19.395    8532-8610/? V/MediaPlayer﹕ callback application
02-25 17:13:19.405    8532-8610/? V/MediaPlayer﹕ back from callback
02-25 17:13:20.406     220-8584/? V/MediaPlayerService﹕ [470] notify (0x51b7aa00, 3, 100, 0)
02-25 17:13:20.406    8532-8544/? V/MediaPlayer﹕ message received msg=3, ext1=100, ext2=0
02-25 17:13:20.406    8532-8544/? V/MediaPlayer﹕ buffering 100
02-25 17:13:20.406    8532-8544/? V/MediaPlayer﹕ callback application
02-25 17:13:20.406    8532-8544/? V/MediaPlayer﹕ back from callback
02-25 17:13:21.407     220-8584/? V/MediaPlayerService﹕ [470] notify (0x51b7aa00, 3, 100, 0)
02-25 17:13:21.407    8532-8611/? V/MediaPlayer﹕ message received msg=3, ext1=100, ext2=0
02-25 17:13:21.407    8532-8611/? V/MediaPlayer﹕ buffering 100
02-25 17:13:21.407    8532-8611/? V/MediaPlayer﹕ callback application
02-25 17:13:21.417    8532-8611/? V/MediaPlayer﹕ back from callback

并且这种重复永远不会结束,直到您强行关闭或卸载或其他剧烈的事情为止。 我已经尝试过:

  • webView.onPause();这会暂停视频,使其停止在后台播放,但不会终止 MediaPlayer。
  • webView.destroy();仍然无法阻止僵尸 MediaPlayer
  • webView = null; nope
  • webView = new WebView(this);还是不行
  • finish();
  • 我还尝试了各种方法来获取 WebChromeClient 并销毁它,但没有任何效果。

当我尝试更多的事情时,我会更新这个列表。感谢您的帮助。

  • 我现在还尝试将 webView 重定向到非视频内容webView.loadData("hi", "text/html", null);还活着...

破解答案

嗯,这是我能找到的最好的。如果有人有更好的解决方案,请仍然告诉我。

为了得到MediaPlayer为了停止,我告诉它去页面<video>指向视频以外的内容的标签。

String html = "<video width=\"320\" height=\"240\" controls>" +
    "<source src=\"http://www.w3schools.com/html/NOT_A_MOVIE.mp4\" " +
    "type=\"video/mp4\"></video>";
webView.loadData(html, "text/html", null); 

当我这样做时,我会在屏幕上看到一个视频播放器,当我单击播放按钮时,它会记录

02-26 12:26:37.112    220-11354/? V/MediaPlayerService﹕ [576] notify (0x47fa92b8, 100, 1, -1004)
02-26 12:26:37.112  11264-11325/com.test.webviewtest V/MediaPlayer﹕ message received msg=100, ext1=1, ext2=-1004
02-26 12:26:37.112  11264-11325/com.test.webviewtest E/MediaPlayer﹕ error (1, -1004)
02-26 12:26:37.112  11264-11325/com.test.webviewtest V/MediaPlayer﹕ callback application
02-26 12:26:37.112  11264-11325/com.test.webviewtest V/MediaPlayer﹕ back from callback
02-26 12:26:37.122  11264-11264/com.test.webviewtest E/MediaPlayer﹕ Error (1,-1004)

从此时起,MediaPlayer似乎大部分已经死了(只有一点点活着)。它停止所有日志记录活动,这是期望的结果。唯一剩下的痕迹是当您强制关闭应用程序时,您仍然会看到这一点。

02-26 12:29:35.826      220-738/? V/MediaPlayerService﹕ Client(576) destructor pid = 11264
02-26 12:29:35.836      220-738/? V/MediaPlayerService﹕ disconnect(576) from pid 11264
02-26 12:29:35.836      220-738/? W/MediaPlayerService﹕ native_window_api_disconnect returned an error: Broken pipe (-32)

我对此表示同意,但真正的解决方案会很好。显然,我会将不良视频与自动播放连接起来,这样崩溃就可能在后台发生,但这就是框架。


更新 2-27-14 虽然这“解决”了三星设备上的问题,但它确实破坏了其他设备,因此这不是一个好的解决方案。在其他设备上(已测试 Nexus 7),此代码将使 WebView 对任何未来的调用都无用。当我找到更多信息时,我会更新此内容。如果您在应用程序的剩余生命周期中永远不需要渲染另一个 WebView,我想那没问题,但我需要它能够稍后加载另一个页面。


对我来说,除了以下方法之外,没有其他解决方案有效:

android.os.Process.killProcess(android.os.Process.myPid());

这会带来麻烦,您实际上无法从内部创建活动,但我已经通过第二个过程克服了这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android WebView HTML5 Video Spawns MediaPlayer 永远存在于三星 S4 上 [找到了被黑的答案] 的相关文章

随机推荐

  • NetworkStream 和 Socket 类有什么区别?

    我有一个项目 我可能想抽象客户端和服务器之间的通信 我最初使用的是套接字和 TCP 然后我认为能够切换到进程间通信通道可能会很好 然后我查看了 System IO PipedStream 类 发现 PipeStream 和 Socket 类
  • PowerShell Start-Service无限运行

    Problem 因此 我有一段代码用于启动服务 如果服务花费太长时间并且在大多数情况下工作正常 则服务超时 不幸的是 当该服务尝试启动无法启动的服务时 它会显示以下警告消息 WARNING Waiting for ServiceName
  • 从数组中删除重复的字符串?

    如何在不使用 HashSet 的情况下从字符串数组中删除重复的字符串 我尝试使用循环 但没有删除的话 StringBuffer outString new StringBuffer Our aim and isn t easy you yo
  • 创建 OpenLayer 圈时出现问题

    如何在openlayer地图中画一个圆 我尝试过不同的方式 但它不起作用 请帮助我编写代码 我使用了以下代码 但它创建了多边形 var p1 new OpenLayers Geometry Point 439000 114000 var p
  • 我可以在我的视图模型中创建一个实时数据观察器吗?或者我应该始终观察片段/活动?

    我是 MVVM 新手 因此 我的片段 活动向服务器发出了 2 个请求 第一个请求的结果将用作第二个请求的输入参数 因此 首先在我的片段中 当单击按钮时 我会发出请求以检查用户是否被禁止 如果没有 则该用户可以创建帖子 所以首先我检查用户是否
  • 检测两年以上的浏览器

    这是一个拥有大约 10 000 个用户的私人公司网站 我已经看到了一些浏览器检测的努力 但与浏览器的年龄无关 有人对此有想法吗 相关项目 http fresh browsers com en http fresh browsers com
  • RESTEasy Mock 与异常映射器与上下文

    RESTEasy 模拟框架工作正常 没有异常映射器 接收请求并返回带有预期内容的实体 注册异常映射器并强制异常后 当 RESTEasy 内部调用 ResteasyProviderFactory getContextData type 时 调
  • 如果 div 包含

    标签,jQuery 返回 true 或 false

    让我们来看看 div p this div contains a p tag p div div this one is not div 如果 div 包含特定标签 如上例中的 p 如何为变量分配布尔值 true 或 false div h
  • Spark-单调递增 id 在数据帧中无法按预期工作?

    我有一个数据框df在 Spark 中 它看起来像这样 scala gt df show columna1 columna2 0 1 0 4 0 2 0 5 0 1 0 3 0 3 0 6 0 2 0 7 0 2 0 8 0 1 0 7 0
  • 模拟器:错误:x86 模拟当前需要硬件加速

    我尝试在 Android Studio 中运行我的 Hello World 应用程序 我收到以下错误 模拟器 错误 x86 模拟当前需要硬件 加速 请确保英特尔 HAXM 已正确安装且可用 CPU加速状态 HAX内核模块未安装 你能告诉我如
  • 如何映射网址?

    我想映射这样的页面domain content myProject home html to domain home html content myProject 不需要 我有以下代码 String newpath getResourceR
  • 如何在 Google Optimize 中的 Document Ready 上运行 Javascript?

    如何在 Google 优化广告系列中的窗口加载或文档就绪时运行 javascript 它似乎允许我选择 DOM 元素一直到 Body 但我需要在文档准备好时运行 js 这就是我的做法 在可视化编辑器中编辑您的实验变体 单击选择元素图标 左上
  • Flutter (Dart) 如何在应用程序中点击时将副本添加到剪贴板?

    我是 Flutter 的初学者 我刚刚开始遵循他们的名称生成器应用程序教程并制作了一个简单的名称生成应用程序 我想知道当用户点击名称时是否可以添加复制到剪贴板功能 我尝试实现在堆栈上找到的解决方案 但它不起作用 我的完整代码在这里 任何建议
  • 检查Python中的字符串是否包含日期或时间戳[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要想出一个函数 它将接受一个字符串 它将执行以下操作 检查它是否是 UTC 格式的时间戳 例如 如果它的形式为2014 05 10T1
  • 为什么 scanf() 在某些情况下需要 & 运算符(地址),而在其他情况下不需要? [复制]

    这个问题在这里已经有答案了 为什么我们需要放一个 运算符在scanf 用于将值存储在整数数组中 但不能将字符串存储在字符数组中 int a 5 for i 0 i lt 5 i scanf d a i but char s 5 scanf
  • Keras LSTM:检查模型输入维度时出错

    我是 keras 的新用户 正在尝试实现 LSTM 模型 为了测试 我声明了如下所示的模型 但由于输入维度的差异而失败 虽然我在这个网站上发现了类似的问题 但我自己无法发现我的错误 ValueError Error when checkin
  • 在图像上写文字 查看图像

    目前 我正在开发一个应用程序 其中我有一个图像视图 图像不断 一段时间后发生变化 现在我希望我能够写一些文字或绘制任何符号 简单线 十字线意味着在图像上绘图出现在图像视图中 意思是我想要 在图像上添加文本或绘制一些符号或线条等 我到处寻找但
  • 如何删除所有 git origin 和 local 标签?

    如何删除已经推送的 git 标签 删除所有 git 远程 原始 标签并删除所有 git 本地标签 删除所有本地标签 可选推荐 git tag d git tag l 获取远程所有标签 可选推荐 git fetch 删除所有远程标签 Note
  • Angular 2 指令现在“可扩展”吗?

    我对 Angular 1 遇到的最大问题是扩展指令 在面向对象的意义上 是多么困难 例如 几乎不可能重复使用input number 我的自定义小部件上的指令 我必须重新实现所有验证和类型转换代码 Angular 2 组件是作为类实现的 因
  • Android WebView HTML5 Video Spawns MediaPlayer 永远存在于三星 S4 上 [找到了被黑的答案]

    据我所知 这似乎是最近的三星设备特有的 S4将做到这一点 Nexus 7 不会 如果带有 WebChromeClient 的 WebView 开始播放 HTML5 视频 它会创建一个 MediaPlayer 实例 一旦视频结束 似乎没有办法