ADD*_*uid 6 video html5 android webview android-mediaplayer
从我能够找到的,这似乎特定于最近的三星设备.S4会这样做.Nexus 7不会.
如果带有WebChromeClient的WebView开始播放HTML5视频,则会创建一个MediaPlayer实例.一旦视频结束,似乎没有办法杀死MediaPlayer缺少System.exit(0).
这是我的整个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...
}
}
Run Code Online (Sandbox Code Playgroud)
自然这在清单中是必需的
<uses-permission android:name="android.permission.INTERNET"/>
Run Code Online (Sandbox Code Playgroud)
一旦您单击视频,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
Run Code Online (Sandbox Code Playgroud)
而这种重复永远不会结束,直到你强行关闭或卸载或其他一些激烈的东西.我已经尝试过了:
webView.onPause(); 这会暂停视频,使其停止在后台播放,但不会杀死MediaPlayer.webView.destroy(); 仍然没有停止僵尸MediaPlayerwebView = null; 不webView = new WebView(this); 仍然不finish(); 当我尝试更多的东西时,我会更新这个列表.感谢帮助.
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);
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我在屏幕上看到一个视频播放器,当我点击播放按钮时,它会记录
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)
Run Code Online (Sandbox Code Playgroud)
从这一点开始,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)
Run Code Online (Sandbox Code Playgroud)
我很好,但真正的解决方案会很好.我显然会使用自动播放连接坏视频,因此崩溃可能发生在后台,但这就是框架.
更新2-27-14虽然这可以解决三星设备上的问题,但确实打破了其他设备,因此这不是一个好的解决方案.在其他设备(Nexus 7测试)上,此代码将使WebView对将来的任何调用都无用.当我找到更多信息时,我会更新这个.如果您永远不需要在应用程序的剩余生命周期内渲染另一个WebView,我想这没关系,但我需要它能够在以后加载另一个页面.
小智 1
对我来说,除了以下方法之外,没有其他解决方案有效:
android.os.Process.killProcess(android.os.Process.myPid());
Run Code Online (Sandbox Code Playgroud)
这会带来麻烦,您实际上无法从内部创建活动,但我已经通过第二个过程克服了这个问题。
| 归档时间: |
|
| 查看次数: |
3627 次 |
| 最近记录: |