Bitte verzeihen Sie mir, aber während ich diese Frage schrieb, kamen einige Ideen auf, so dass die Frage als Protokoll der Ereignisse erscheinen kann, aber Sie können sicher zum TL; DR -Teil springen.
Ich habe ein AAR
-Modul, in dem ich ein WebView
verwende, um eine Seite anzuzeigen und Audiodateien mit unterschiedlicher Startzeit abzuspielen - abhängig vom Kontext.
Ich habe zwei Apps, in denen ich das AAR
-Modul teste: eine Test-App, die zum Ausführen des Moduls erforderlich ist, und die echte App, bei der es eine Weile dauert, bis der Modulfluss erreicht ist .
Ich wurde über einen Fehler auf mehreren Testgeräten informiert, bei denen die Audiowiedergabe immer bei 0 beginnt, ganz zu schweigen von dem verwendeten Audioelement currentTime
setting.
Hier ist mein Code, wo die Wiedergabe erfolgt:
%Vor%Wie in den Kommentaren erwähnt, habe ich einige Haltepunkte hinzugefügt, um zu überprüfen, was vor sich geht, und hier sind einige Schlussfolgerungen:
oncanplaythrough
event aufgerufen wurde, wird die Dauer auf 0
, currentTime
des Audioelements auf einen anderen Wert als 0
gesetzt wird, bleibt es bei 0
, currentTime
-Wert wiedergegeben. Laut W3Schools Website ist canplaythrough
das letzte mögliche Ereignis, das beim Laden der Audiodatei aufgerufen wird.
Das genannte Szenario ist auf 10% unserer Testgeräte möglich. Diese Geräte stammen von verschiedenen Herstellern (Lenovo, Samsung) und haben unterschiedliche Android-Versionen (5.0.1, 6.0.1). Ich habe auch andere Geräte von diesen Herstellern, die funktionieren.
Ich habe mich dazu entschieden, meine Bare-Bones-App zu testen, weil sie schneller ist und etwas Seltsames passiert ist - sie funktioniert auf den oben genannten 10% der Testgeräte einwandfrei:
oncanplaythrough
event ausgelöst wurde, currentTime
wird im Audioelement Ich war ziemlich geschockt, also habe ich alle möglichen Unterschiede zwischen den Apps überprüft:
AAR
-Datei wird in beiden Projekten verwendet Ich habe einen Unterschied gefunden, die beiden Apps würden ihre Daten an verschiedenen Orten speichern. Die Haupt-App, speichert Daten im Dokumenten-Verzeichnis, meine Bare-Bones-App speichert ihre Daten im externen Speicher [so ist es einfacher zu debuggen].
Nachdem ich den Speicherpfad für die Haupt-App auf extern geändert habe, begann die App ordnungsgemäß zu funktionieren und das Audio korrekt abzuspielen.
Ich weiß, dass ich nicht einfach auf Daten zugreifen kann, die in APK
gespeichert sind, aber diese Daten werden aus dem Netzwerk heruntergeladen und im Dokumentenverzeichnis gespeichert, daher würde ich keine Einschränkungen erwarten.
TL; DR
Beim Laden von Audiodateien im HTML-Audioelement aus dem Dokumentenverzeichnis der App im canplaythrough
-Ereignis kann ich nicht auf duration
des Audioelements zugreifen (es ist 0) oder currentTime
setzen (bleibt bei 0 bis zur Wiedergabe). Wenn die gleiche Datei von externem Speicher (eingebautem Speicher) geladen wird, funktioniert es gut und ich kann die Audio-Datei duration
bekommen und die currentTime
-Eigenschaft einstellen.
Was kann ich tun, damit es funktioniert, während sich Audio im Dokumentenverzeichnis der App befindet?
Ich bin mir nicht sicher, warum es einige Geräte betrifft, und es betrifft nicht andere Geräte, aber ich ging durch die Quellen des Chromium-Projekts und stolperte darüber:
und um genauer zu sein:
%Vor%Ich habe das Dokumentenverzeichnis in das Cache-Verzeichnis geändert und alles funktioniert wie erwartet.
Tags und Links android webview html5-audio