Ich verstehe, dass HTML5-Videos auf Android nicht automatisch abgespielt werden können. Wie es aussieht, funktioniert mein Video auf dem Gerät nur, wenn der Benutzer auf die Wiedergabetaste klickt.
<video width="640px" height="360px" src="media/video/Moments_of_Everyday_Life.mp4" controls id="video"></video>
<script type="text/javascript">
$(function(){
var video = document.getElementById('video');
video.play();
});
</script>
Es funktioniert jedoch auf meinem Desktop.
Warum sollte das nicht funktionieren? Und was ist der Unterschied zwischen dem Klicken auf Play und der Verwendung von .play()
?
Nach stundenlangem Suchen und Testen von "Lösungen" hat dies für mich funktioniert! Gelöst von Angry Fridges (vielen Dank dafür).
<video id="video" class="video" autoplay muted >
bemerkte beide autoplay und stummgeschaltet , sie werden beide benötigt.
Dadurch konnte das Video sowohl auf dem Computer als auch auf dem Android-Handy abgespielt werden.
Ich habe es geschafft zu arbeiten! Jetzt kann HTML5-Video inline mit "Autoplay" abgespielt werden! Verdammt, das hat Zeit gekostet! Ok das habe ich getan:
<div id=content>
<video width="1280px" height="720px" src="file:///Android_asset/videos/Moments_of_Everyday_Life.mp4"></video>
</div>
Hinweis: Einige Leute sagen, dass sie es zum Funktionieren bringen, wenn sie Poster hinzufügen und/oder vorladen. Ich habe das mit und mit raus gebracht.
Javascript spielt das Video automatisch ab:
<script type="text/javascript">
$(function(){
function callback () {
document.querySelector('video').src = document.querySelector('video').src
document.querySelector('video').play();
}
window.addEventListener("load", callback, false);
});
</script>
Ich hoffe, das kann irgendjemandem helfen, ich habe jetzt seit einer Woche damit zu kämpfen!
Nur um es klar auszudrücken:
arbeiten an:
Android 4.0.4 Samsung 10.1 Tablet Browser für native Geräte
Ich habe bei KitKat festgestellt, dass Sie mit Firefox Videos programmgesteuert abspielen können.
Chrome funktioniert auch, wenn Sie chrome: // flags aufrufen und die Option "Gestenanforderung für Medienwiedergabe deaktivieren" aktivieren.
Ich habe die folgenden Entdeckungen über HTML5-Videos unter Android 4.0 und höher gemacht.
Um diese Tests durchzuführen, habe ich eine Sandbox-App erstellt, die aus einer in/assets gespeicherten HTML-Seite bestand.
HTML:
<!DOCTYPE html>
<html>
<head>
<title>HTML5 Video Test</title>
</head>
<body>
<video preload="metadata"><source src="http://www.w3schools.com/html/movie.mp4" type="video/mp4"></video>
<script>
var myvideo = document.getElementsByTagName('video')[0];
myvideo.addEventListener('loadeddata', function() {
console.log("** RECEIVED loadeddata **");
myvideo.play();//this first play is needed for Android 4.1+
}, false);
myvideo.addEventListener('canplaythrough', function() {
console.log("** RECEIVED canplaythrough **");
myvideo.play();//this second play is needed for Android 4.0 only
}, false);
</script>
</body>
</html>
Java: ("/assets/html5video.html")
private WebView mWebView;
private ProgressBar mProgressBar;
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.videotest);
// progress bar
mProgressBar = (ProgressBar) findViewById(R.id.videotest_progressbar);
mProgressBar.setProgress(0);
mProgressBar.setVisibility(View.VISIBLE);
// webview
mWebView = (WebView) findViewById(R.id.videotest_webview);
mWebView.getSettings().setJavaScriptEnabled(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
{
//NOTE: this is required only for Android 4.2.2+
mWebView.getSettings().setMediaPlaybackRequiresUserGesture(false);
}
mWebView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
Log.i(TAG, "Progress = "+progress);
mProgressBar.setProgress(progress);
}
});
mWebView.setWebViewClient(new WebViewClient() {
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Toast.makeText(TestActivity.this, "Problem loading webpage", Toast.LENGTH_LONG).show();
mProgressBar.setVisibility(View.GONE);
}
public void onPageFinished(WebView view, String url) {
mProgressBar.setVisibility(View.GONE);
}
});
}
@Override
protected void onResume() {
super.onResume();
mWebView.loadUrl("file:///Android_asset/html5video.html");
}
Android 4.0.3 HINWEIS
Ich bin immer wieder auf die nervige Ausnahme Java.lang.Throwable: EventHub.removeMessages(int what = 107) is not supported before the WebViewCore is set up.
gestoßen. Zum Glück hatte dies keine Auswirkungen auf die Videowiedergabe.
Es würde nicht aus dem gleichen Grund funktionieren, aus dem Browser Aufrufe an window.open()
blockieren, da Webentwickler durch das Zulassen der Funktion die Benutzerpräferenz untergraben könnten, Medien nicht automatisch abzuspielen (oder Popup-Fenster zu öffnen).
Der Unterschied zwischen der Klickwiedergabe und der Verwendung dieser Methode ist genau das, was Sie gesagt haben: der Klick. Diese Art von Aufrufen ist in Klickereignissen zulässig, jedoch nicht generell.
Ich habe hier einige Ratschläge befolgt, vor allem von @JenniferG, aber ich musste noch zwicken, um eine schöne Erfahrung zu machen ... Hier sind die wichtigsten Punkte
audio
Tags, wie von @JenniferG erwähntrefs
play()
Methode gibt ein Versprechen zurück ( zumindest in Chrome ); Verwenden Sie catch
, um Fehler angemessen zu behandelnplay()
nicht aufzurufen, während der Ton abgespielt wird. In diesem Fall schlägt dies fehlHinweis: Wenn der Benutzer nicht auf eine Schaltfläche klickt, wird eine solche Fehlermeldung angezeigt
play () ist fehlgeschlagen, weil der Benutzer nicht zuerst mit dem Dokument interagiert hat.
Zusammengefasst ist hier eine Beispielkomponente React), die als angemessener Ausgangspunkt dienen sollte (sie ist erfunden, sollte aber die Möglichkeiten veranschaulichen).
class AudioPlayer extends React.Component
{
constructor(props) {
super(props);
this.audioRef = React.createRef();
this.state = {
interacted: false,
firstSoundPlayed: false,
secondSoundPlayed: false,
};
}
playAudio = () => {
const node = this.audioRef.current;
node.muted = false;
node.volume = 1.0;
node
.play()
.catch((e) => {
console.error('caught audio error: ', e.message);
});
}
handleClick = () => {
this.setState({
interacted: true,
});
setTimeout(() => {
this.playAudio();
this.setState({
firstSoundPlayed: true,
});
setTimeout(() => {
this.playAudio();
this.setState({
secondSoundPlayed: true,
});
}, 6000);
}, 4000);
}
renderStartup = () => (
<p>
Please give me permission to play sounds...
<button onClick={this.handleClick}>Grant permission</button>
</p>
)
renderScreen = () => (
<div>
<p>I will play a sound as many times as I want now!</p>
<p>A sound is about to play...</p>
</div>
)
renderSecondSound = () => (
<div>
<p>Soon it will play again...</p>
</div>
)
renderSummary = () => (
<div>
<p>Hope you found this demo useful...</p>
</div>
)
render = () => {
const {
interacted,
firstSoundPlayed,
secondSoundPlayed,
} = this.state;
return (
<div>
<audio
autoPlay
muted
src="https://freesound.org/data/previews/33/33245_65091-lq.mp3"
ref={this.audioRef}
/>
{interacted === false ? this.renderStartup() : null}
{interacted === true && firstSoundPlayed === false ? this.renderScreen() : null}
{interacted === false || firstSoundPlayed === false || secondSoundPlayed === true ? null : this.renderSecondSound()}
{secondSoundPlayed === false ? null : this.renderSummary()}
</div>);
}
}
ReactDOM.render(
<AudioPlayer />,
document.getElementById('react')
);
<div id="react"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.3.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.3.0/umd/react-dom.production.min.js"></script>
Oder Sie können Ihr WebView wie folgt einfach initialisieren:
webview.setWebViewClient(new WebViewClient() {
// autoplay when finished loading via javascript injection
public void onPageFinished(WebView view, String url) { mMessageContentView.loadUrl("javascript:(function() { document.getElementsByTagName('video')[0].play(); })()"); }
});
Das oben genannte funktioniert gut für mich.