2016-12-15 12 views
6

फ्रीज करता है मैं एंड्रॉइड एप्लिकेशन में रेडियो स्टेशनों को स्ट्रीम करने के लिए cordova-plugin-media के साथ cordova 6.4.0 का उपयोग कर रहा हूं। दुर्भाग्यवश एक मामला है, जहां आवेदन अब ठीक से प्रतिक्रिया नहीं दे रहा है।कॉर्डोवा मीडिया प्लगइन - स्ट्रीमिंग बंद नहीं करना स्ट्रीमिंग - रिलीज() डिवाइस

मान लें कि उपयोगकर्ता रेडिस्टेशन स्ट्रीम करना चाहता है, लेकिन स्ट्रीम लोड होने पर, वह इसे निरस्त करना चाहता है (उदाहरण के लिए क्योंकि स्ट्रीम डाउन है, या लोड करने में बहुत अधिक समय लग रहा है)।

इस मामले में मैं प्रक्रिया को रद्द करने में सक्षम नहीं हूं!

media = new Media("http://direct.franceinfo.fr/live/franceinfo-midfi.mp3?ID=f9fbk29m84", mediaPlayerSuccess, mediaPlayerFail, mediaPlayerStatus); 
media.play(); 

अब मैं धारा को बफर करने की प्रक्रिया को रद्द करना चाहता हूं, लेकिन मैं सक्षम नहीं हूं। कार्य:

media.pause(); 
media.stop(); 

में त्रुटि संदेश फेंक रहे हैं एडीबी लॉग इन करें और MediaPlayer-onError कॉलबैक बुला रहे हैं।

D/AudioPlayer(3362): AudioPlayer Error: pausePlaying() called during invalid state: 1 
... 
D/AudioPlayer(3362): AudioPlayer Error: stopPlaying() called during invalid state: 1 

media.release() आदेश धारा की लोडिंग बंद हो जाता है! हालांकि, इसे रोकने के बिना स्ट्रीम को छोड़कर, अन्य कारणों से बड़ी समस्याएं होती हैं:

अधिकांश समय सिस्टम बहुत धीमी प्रतिक्रिया देता है और कुछ सेकेंड लटकता है, अगर आप मीडिया-ऑब्जेक्ट पर media.release() पर कॉल करते हैं। लेकिन यदि आप अक्सर ऐसा करते हैं, तो सिस्टम पूरी तरह से को फ्रीज करता है। मतलब यह अब रिमोट कंट्रोल कमांड accetp नहीं है। एडब-लॉग अभी भी काम कर रहा है, लेकिन इस मामले में कोई त्रुटि नहीं दिखाता है। केवल पावर-बटन अभी भी काम कर रहा है (यह ताले और स्क्रीन को अनलॉक करता है)। इस खराब स्थिति से पुनर्प्राप्त करने का एकमात्र तरीका डिवाइस को रीबूट करना है।

अगर मैं खेल नहीं रहा हूं तो मुझे मीडिया-स्ट्रीम को कैसे रद्द करना है, अभी तक? क्या यह प्लगइन में एक बग है?

संलग्न कोड-स्निपेट है, जिसे मैं मीडिया-स्ट्रीमिंग-तर्क को संभालने के लिए उपयोग करता हूं। ऊपर वर्णित की तरह ... यह मूल रूप से काम करता है, लेकिन यदि आप इसे कई बार कहते हैं, तो यह धीमा हो जाता है या डिवाइस को फ्रीज करता है।

function radioControl(action, media_src){ 
    //media_src is a webradio-streamurl. 

    if(action == 'play') { 

    // Initial Play 
    if(media === null){ 
     mediaCreateObject(media_src); 
    } 

    // If we get PLAY but on antoher station 
    else if(media.src != media_src){ 
     mediaReleaseRessources(); 
     mediaCreateObject(media_src); 
    } 

    //interrupt_timer = false; 
    if(media === null){ 
     mediaCreateObject(media_src); 
    } 
    media.play(); 
    } 
    else if (action === 'pause') { 
    //If we get "pause", but it didn't even start yet 
    if(media._duration == -1){ 
     mediaReleaseRessources(); 
    } 
    else{ 
     media.pause(); 
    } 
    } 
} 

function mediaCreateObject(media_src){ 
    media = new Media(media_src, mediaPlayerSuccess, mediaPlayerFail, mediaPlayerStatus); 
} 

function mediaReleaseRessources(){ 
    media.release(); 
} 
+0

इस आयनिक 1 या 2 या किसी अन्य है? –

+0

कोई ईओण, बस कॉर्डोबा '6.4.0' –

+0

@MichaelB मैं तुम्हें पहले media.stop आह्वान होगा महसूस हो रहा है() और फिर संसाधनों को रिहा करने media.release() कहते हैं। कृपया – Gandhi

उत्तर

3

मुझे पता चला है कि यह एक कॉर्डोबा मुद्दा नहीं है, लेकिन एक 8 वर्षीय (!) Android-बग, कि कभी नहीं तय हुई थी। यहाँ देखें:

https://code.google.com/p/android/issues/detail?id=959

MediaPlayer "crash" (deadlocks the calling thread) when resetting or releasing an unused MediaPlayer

असल समस्या है: आप कोशिश करते हैं करने के लिए "रिहाई" एक मीडिया-वस्तु कि नहीं चल रहा है (अभी तक), यह बुला धागा गतिरोध होगा, जो इस सवाल में मैंने जो ठंड का उल्लेख किया है, उसका कारण बनता है। दुर्भाग्य से उन्होंने कभी भी इस बग को ठीक नहीं किया, लेकिन इसे "अप्रचलित" के रूप में चिह्नित किया। एंड्रॉइड 5.1.1 में। बग जाहिर है अभी भी वहाँ है। शायद वे इसे बाद के संस्करणों में तय कर दिया।


मैं इस समस्या के लिए एक नहीं बल्कि बदसूरत वैकल्पिक हल कर दिया है, लेकिन यह काम कर रहा है। असल में मैंने क्या किया: हम प्रत्येक मीडिया-ऑब्जेक्ट को जावास्क्रिप्ट-ऑब्जेक्ट में सहेजते हैं। यदि उपयोगकर्ता इसे रोकता है, जबकि यह खेलता है, तो हम ऑब्जेक्ट को रोक और हटा सकते हैं।लेकिन अगर यह नहीं चल रहा है, हम इस जावास्क्रिप्ट वस्तु media_objects = {}; में इस मीडिया-वस्तु छोड़ इसके अलावा हम एक चर में वर्तमान में active_media धारा को बचाने के।

अगर कॉर्डोवा mediaPlayerStatusChange कॉल करता है -कॉलबैक हम media_objects के माध्यम से लूप करते हैं और जांचते हैं कि "लंबित" -बोजेक्ट्स में से किसी एक की स्थिति अब "चल रही" हो गई है या नहीं। - Cordova justs किसी भी indictation क्या मीडिया-वस्तु वास्तव में सिर्फ राज्य बदल के बिना मीडिया-स्थिति-परिवर्तन-कॉलबैक कहता है। यही कारण है कि दुर्भाग्य की बात है, तो हम जांच करने के लिए है, तो pending- "अप्रचलित" वस्तुओं में से एक अब खेलना शुरू कर दिया। यदि ऐसा है, तो हम इसे रोक सकते हैं और इसे छोड़ सकते हैं। (वस्तु वास्तव में खेल रहा है, तो बंद करो और रिहाई की तरह इरादा काम करता है - केवल अगर यह नहीं खेल है, यह दुर्घटना का कारण बनता है)

function mediaPlayerStatusChange(status){ 
    mediaReleaseRessources(); 
    // handle status change.... 
    // ...... 
} 

function mediaReleaseRessources(){ 

    for(var key in media_objects) { 
    // We can only stop-and release an object, if it is playing 
    // If an object started playing, the "_duration"-value is != -1 
    if(key !== active_media && media_objects[key]._duration != -1) { 
     media_objects[key].stop(); 
     media_objects[key].release(); 
     delete media_objects[key]; 
    } 
    } 
} 

यह समाधान मेरे लिए काम करता है, तथापि मैं अभी भी एक बेहतर और क्लीनर रास्ता में दिलचस्पी है कॉर्डोवा में कई मीडिया-स्ट्रीम को संभालने के लिए।

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