2017-08-04 15 views
8

कृपया मुझे क्षमा करें, लेकिन जैसा कि मैं इस सवाल को लिख रहा था, कुछ विचार सामने आए, इसलिए सवाल घटनाओं के लॉग के रूप में देख सकता है, लेकिन आप सुरक्षित रूप से टीएल; डीआर भाग पर सुरक्षित रूप से जा सकते हैं।क्यों मैं एंड्रॉइड वेबव्यू में एचटीएमएल ऑडियो एलीमेंट में वर्तमान समय और अवधि बराबर 0 सेट नहीं कर सकता?

मेरे पास AAR मॉड्यूल है जिसमें मैं एक पृष्ठ प्रदर्शित करने के लिए WebView का उपयोग करता हूं और संदर्भ के आधार पर विभिन्न प्रारंभ समय के साथ ऑडियो फ़ाइलों को चलाता हूं। मेरे पास दो ऐप्स हैं जहां मैं AAR मॉड्यूल का परीक्षण करता हूं: एक परीक्षण ऐप, जो मॉड्यूल चलाने के लिए आवश्यक नंगे हड्डियों और वास्तविक ऐप जहां मॉड्यूल भाग में जाने के लिए ऐप के प्रवाह के माध्यम से प्रगति करने में कुछ समय लगता है।

मुझे कई परीक्षण उपकरणों पर एक त्रुटि के बारे में सूचित किया गया था, जहां ऑडियो प्लेबैक हमेशा 0 से शुरू होता है, ऑडियो तत्व currentTime सेटिंग को कभी भी ध्यान में रखें।

var instance = this; 
this.playbackCurrentAudioPath = newBufferPath; 
this.playbackCurrentAudio = document.createElement('audio'); 
this.playbackCurrentAudio.src = this.playbackCurrentAudioPath; 
this.playbackCurrentAudio.oncanplaythrough = function() { 
    console.log("file loaded, try to play " + instance.playbackCurrentAudio); 
    instance.loaded = true; 
    // checked here, instance.playbackCurrentAudio.duration is equal 0 
    instance.playbackCurrentAudio.currentTime = audioTrackBeginTime; 
    // instance.playbackCurrentAudio.currentTime is equal 0 
    instance.playbackCurrentAudio.play(); 
    // playback starts from the beginning of the file 
}; 
this.playbackCurrentAudio.onerror = function() { 
    instance.playbackLoadError() 
}; 
this.playbackCurrentAudio.onended = function() { 
    instance.playbackAudioEnded(true) 
}; 
this.playbackCurrentAudio.load(); 

के रूप में टिप्पणी में कहा गया है, मैं क्या हो रहा है की जाँच करने के कुछ breakpoints जोड़ लिया है, और यहाँ कर रहे हैं कुछ निष्कर्ष:

  • के बाद

    यहाँ मेरी कोड है, जहां प्लेबैक नियंत्रित किया जाता है है oncanplaythrough ईवेंट कहा जाता है, अवधि 0,

  • पर सेट की जाती है जब ऑडियो तत्व currentTime को 0 के अलावा कुछ मूल्य पर सेट करते समय, यह बनी हुई है 0,
  • ऑडियो फ़ाइल ठीक खेलती है और प्लेबैक समय currentTime मान में परिलक्षित होता है।

W3Schools साइट के अनुसार, canplaythrough ऑडियो फ़ाइल लोड करते समय अंतिम संभावित घटना है।

हमारे परिदृश्य उपकरणों का 10% पुन: निर्माण करना संभव है। ये डिवाइस विभिन्न निर्माताओं (लेनोवो, सैमसंग) से आते हैं और विभिन्न एंड्रॉइड संस्करण (5.0.1, 6.0.1) हैं। मेरे पास इन निर्माताओं से अलग-अलग डिवाइस भी हैं जो ठीक काम करते हैं।

मैं अपने नंगे हड्डियों एप्लिकेशन का उपयोग करने का परीक्षण करने का फैसला किया है यह तेजी से है, क्योंकि, और कुछ अजीब हुआ - उस पर ऊपर परीक्षण उपकरणों के 10% का उल्लेख किया ठीक काम करता है:

  • अवधि oncanplaythrough के बाद सही ढंग से रिपोर्ट किया गया है घटना निकाल दी गई है,
  • currentTime की सेटिंग ऑडियो तत्व,
  • ऑडियो अनुरोध में पल से खेलना शुरू हो जाता है।

मैं काफी झटका लगा है, इसलिए मैं क्षुधा के बीच संभावित मतभेद के सभी जाँच कर ली है:

  • ही निर्माण Gradle सेटिंग्स का उपयोग किया गया
  • पुस्तकालयों में से एक ही संस्करण का उपयोग किया गया
  • लाइब्रेरी
  • समान AAR फ़ाइल दोनों परियोजनाओं में

मुझे एक अंतर मिला है, दो ऐप्स अलग-अलग स्थानों पर अपना डेटा स्टोर करेंगे। मुख्य ऐप, दस्तावेजों की निर्देशिका में डेटा स्टोर करता है, मेरी नंगे हड्डियों के ऐप बाहरी डेटा में अपना डेटा स्टोर करते हैं [इसलिए डीबग करना आसान है]।

जब मैंने मुख्य ऐप के लिए स्टोरेज पथ बदल दिया है, तो ऐप ठीक काम करने और ऑडियो को सही ढंग से चलाने के लिए शुरू कर दिया।

मुझे पता है कि मैं APK के अंदर संग्रहीत डेटा को आसानी से एक्सेस नहीं कर सकता लेकिन यह डेटा नेटवर्क से डाउनलोड किया गया है और दस्तावेज़ निर्देशिका के अंदर संग्रहीत है, इसलिए मुझे उम्मीद है कि कोई सीमा लागू नहीं होगी।

टी एल; डॉ

जब एप्लिकेशन के दस्तावेजों निर्देशिका से एचटीएमएल के ऑडियो तत्व में ऑडियो फ़ाइलें लोड हो रहा है, canplaythrough घटना में, मैं उपयोग नहीं कर सकते ऑडियो तत्व के duration है और न ही currentTime (0 पर रहता सेट (यह 0 है) जब तक खेला)। जब एक ही फ़ाइल बाहरी भंडारण (स्मृति में निर्मित) से लोड होती है तो यह ठीक काम करती है और मैं ऑडियो फ़ाइल duration प्राप्त कर सकता हूं और currentTime संपत्ति सेट कर सकता हूं।

ऐप की दस्तावेज़ निर्देशिका में ऑडियो स्थित होने पर मैं इसे काम करने के लिए क्या कर सकता हूं?

+0

एचटीएमएल 5-ऑडियो आंतरिक रूप से अधिकांश समय मीडियाप्लेयर का उपयोग करने लगता है। इसका मतलब है कि ऑडियो फ़ाइल को प्लेयर पर सही ढंग से चलाने के लिए विश्व पठनीय अनुमतियों की आवश्यकता होती है। यही कारण है कि यह स्थानीय भंडारण पर सही ढंग से काम नहीं करता है, लेकिन बाहरी भंडारण पर करता है। –

+0

लेकिन अगर फ़ाइल में पढ़ने की अनुमति नहीं थी, तो यह मेरे काम में बिल्कुल काम नहीं करेगा, केवल वेबऑडियो की कुछ विशेषताएं काम नहीं करतीं: वर्तमान समय और पढ़ने की अवधि निर्धारित करना। ऑडियो ठीक खेलता है। – Krystian

+0

नहीं, प्रक्रिया के कुछ तत्वों को पढ़ने की अनुमति हो सकती है, कुछ शायद नहीं। आप बस उस निष्कर्ष पर कूद नहीं सकते हैं। यह स्पष्ट रूप से किसी प्रकार की अनुमति समस्या है, क्योंकि फ़ाइल का स्थान केवल अंतर है। यदि नहीं, तो समय (दौड़ की स्थिति) एकमात्र चीज है जिसे मैं सोच सकता हूं। –

उत्तर

2

मुझे यकीन है कि यह कुछ उपकरणों को प्रभावित करता है क्यों नहीं कर रहा हूँ, और यह अन्य उपकरणों को प्रभावित नहीं करता है, लेकिन मैं क्रोमियम परियोजना के स्रोतों के माध्यम से चला गया और इस पर ठोकर खाई:

https://chromium.googlesource.com/chromium/src/+/61c6121a6cb9dc16f9786830655049d68dcde67c/content/public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java

और अधिक सटीक होना करने के लिए :

private List<String> getRawAcceptableDirectories() { 
    List<String> result = new ArrayList<String>(); 
    result.add("/mnt/sdcard/"); 
    result.add("/sdcard/"); 
    if (PACKAGE_NAME != null) 
     result.add("/data/data/" + PACKAGE_NAME + "/cache/"); 
    return result; 
} 

मैंने दस्तावेज़ निर्देशिका को कैश निर्देशिका में बदल दिया है और सब कुछ अपेक्षित काम करता है।

संबंधित मुद्दे