2010-07-20 12 views
99

मैं निम्नलिखित कोड है:संपत्ति निर्देशिका से ऑडियो फ़ाइल खेलते हैं

AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3"); 
player = new MediaPlayer(); 
player.setDataSource(afd.getFileDescriptor()); 
player.prepare(); 
player.start(); 

समस्या यह है कि, जब मैं इस कोड चलाने के लिए, यह बजाय संपत्ति निर्देशिका में सभी ऑडियो फ़ाइलें खेल रहा शुरू होता है, वर्णमाला के क्रम में है मैंने अनुरोध की ऑडियो फाइल को चलाने का। मैं क्या गलत कर रहा हूं? संपत्ति निर्देशिका से ऑडियो फाइलों को चलाने का कोई बेहतर तरीका है?

अनुवर्ती प्रश्न: क्या संपत्ति निर्देशिका में ऑडियो फ़ाइलों को रखने और उन्हें res/raw निर्देशिका में रखने के बीच कोई अंतर है? इस तथ्य के अलावा कि अगर वे संपत्ति निर्देशिका में हैं तो उन्हें आईडी नहीं मिलती हैं। अगर मैं ऑडियो फ़ाइलों को res/raw फ़ोल्डर में ले जाता हूं तो मुझे MediaPlayer s का उपयोग करने में समस्या है क्योंकि setDataSource() के लिए कोई आईडी पैरामीटर नहीं है। मुझे इस तरह की समस्या को संभालने के लिए एक अच्छा दिशानिर्देश नहीं मिल रहा है।

उत्तर

205
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 

आपका संस्करण यदि आप संपत्ति निर्देशिका में केवल एक फ़ाइल था काम करेगा। संपत्ति निर्देशिका सामग्री वास्तव में डिस्क पर 'वास्तविक फ़ाइलें' नहीं हैं। उन सभी को एक दूसरे के साथ एक साथ रखा जाता है। इसलिए, यदि आप कर जहां शुरू करने के लिए और कितने बाइट्स पढ़ने के लिए निर्दिष्ट नहीं है, तो खिलाड़ी अंत तक पढ़ा जाएगा

+1

यह काम किया। धन्यवाद। लेकिन मुझे लगता है कि मेरा संस्करण भी काम करना चाहिए। –

+54

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

+0

बहुत अच्छा जवाब! – Redax

57

इस समारोह (जो है, निर्देशिका संपत्ति में सभी फाइलों चलता रहेगा) ठीक से काम करेगा :)

// MediaPlayer m; /*assume, somewhere in the global scope...*/ 

public void playBeep() { 
    try { 
     if (m.isPlaying()) { 
      m.stop(); 
      m.release(); 
      m = new MediaPlayer(); 
     } 

     AssetFileDescriptor descriptor = getAssets().openFd("beepbeep.mp3"); 
     m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength()); 
     descriptor.close(); 

     m.prepare(); 
     m.setVolume(1f, 1f); 
     m.setLooping(true); 
     m.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+2

मीटर क्या है? आप एम = नए मीडियाप्लेयर() शुरू कर रहे हैं; उसके बाद और पहले इस्तेमाल किया? – Umar

+0

हाय @ उमर, मैंने ग्लोबल वेरिएबल मीडियाप्लेयर एम = नल लिया है; तो मैंने playBeep() फ़ंक्शन –

+0

में असाइन किया है ध्यान रखें कि 'मीडियाप्लेयर एम' 'स्थिर 'होना चाहिए या कोई अन्य ** संदर्भ ** होना चाहिए। यदि आपके पास बिना किसी संदर्भ के फ़ंक्शन में 'm' है, तो 'जीसी' इसे" संग्रहित "करेगा –

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