2011-08-30 9 views
8

मैं एक ही मीडिया प्लेयर का उपयोग करने की कोशिश कर रहा हूं लेकिन डेटा स्रोत बदल रहा हूं। यहाँ है कि मैं क्या करने के लिए कोशिश कर रहा हूँ:  मौजूदा मीडियाप्लेयर का उपयोग कर ऑडियो प्लेबैक के लिए डेटा स्रोत बदल रहा है?

private MediaPlayer mMediaPlayer; 

    public void pickFile1() { 
     initMediaPlayer("myfile1.mp3"); 
    } 

    public void pickFile2() { 
     initMediaPlayer("myfile2.mp3"); 
    } 

    private void initMediaPlayer(String mediafile) { 
    // Setup media player, but don't start until user clicks button! 
    try { 
     if (mMediaPlayer == null) { 
      mMediaPlayer = new MediaPlayer(); 
     } else { 
      mMediaPlayer.reset(); // so can change data source etc. 
     } 
     mMediaPlayer.setOnErrorListener(this); 
     AssetFileDescriptor afd = getAssets().openFd(mediafile); 
     mMediaPlayer.setDataSource(afd.getFileDescriptor()); 
    } 
    catch (IllegalStateException e) { 
     Log.d(TAG, "IllegalStateException: " + e.getMessage()); 
    } 
    catch (IOException e) { 
     Log.d(TAG, "IOException: " + e.getMessage()); 
    } 
    catch (IllegalArgumentException e) { 
     Log.d(TAG, "IllegalArgumentException: " + e.getMessage()); 
    } 
    catch (SecurityException e) { 
     Log.d(TAG, "SecurityException: " + e.getMessage()); 
    } 

    mMediaPlayer.setOnPreparedListener(this); 
    mMediaPlayer.prepareAsync(); // prepare async to not block main thread 
    mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); // Keep playing when screen goes off! 
} 

मैं सिर्फ यह फोन जब मैं एक नया MediaFile को बदलना चाहते हैं। ऐसा लगता है कि डेटा स्रोत सफलतापूर्वक बदल नहीं रहा है। पहला सवाल: क्या यह इस तरह से करना संभव है, या क्या मुझे मीडिया प्लेयर जारी करना है और प्रत्येक नई फ़ाइल के लिए एक नया बनाना है? यदि यह संभव है, तो मेरा कोड सही क्यों काम नहीं कर रहा है?

संपादित करें: मीडिया प्लेयर को अच्छी तरह से रिलीज़ करना और पुनर्निर्माण करना भी ऐसा नहीं कर रहा है! यह सिर्फ वही गीत खेलता रहता है!? यह ऐसे कैसे संभव है? नया विचार - प्रत्येक ट्रैक के लिए एक अलग मीडिया प्लेयर बनाएं, क्या वास्तव में मुझे यहां क्या करना है? क्या यह शायद एंड्रॉइड में एक बग है?

उत्तर

0

ठीक है, मुझे इसके लिए वास्तव में अच्छा जवाब नहीं मिला। मुझे लगता है कि यह कुछ मजाकिया हो सकता है जो एमुलेटर में होता है। मैंने जो किया है वह मेरे लिए बहुत अच्छा काम कर रहा है, फाइलों को बाहरी एसडी कार्ड में डाउनलोड करना और उन्हें वहां से खेलना है। इससे कोड थोड़ा सा बदल जाता है:

String path = getExternalFilesDir(null).toString() + "/"; 
mMediaPlayer.setDataSource(path + mediafile); 

बाकी शेष बना रहता है।

0

आप private String mediafile="my.mp3"; घोषित करते हैं तो आप AssetFileDescriptor afd = getAssets().openFd(mediafile); का उपयोग करते हैं लेकिन किसी भी समय (आपके द्वारा पोस्ट किए गए कोड से) आप mediafile का मान बदलते हैं।
मैं afd = getAssets().openFd(mediafile); से पहले लाइन पर mediafile = theNextFile; डालने की अनुशंसा करता हूं, जहां theNextFile संभवतः एसडी कार्ड पर एक फ़ाइल को संदर्भित करेगा जिसे उपयोगकर्ता ने कहा बटन क्लिक करने से पहले चुना था।
मुझे यकीन नहीं है कि एसडी कार्ड से फ़ाइल नाम कैसे प्रबंधित करें, लेकिन मुझे लगता है कि startActivityForResult का उपयोग करना एक ऐसा तरीका होगा।

+0

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

2

मुझे वास्तव में आज संपत्तियों के साथ यही समस्या है, और मुझे ठीक पता है।

समस्या यह है कि संपत्तियों को वास्तविक फ़ाइल सिस्टम पर कहीं भी व्यक्तिगत फ़ाइलों के समूह के बजाय डेटा के एक बड़े हिस्से के रूप में संग्रहीत किया जाता है। इसलिए, जब आपको assetfiledescriptor मिलता है, तो यह दोनों फाइलों को इंगित करता है, लेकिन ऑफसेट और लम्बाई भी होती है। यदि आप mediaplayer को assetfiledescriptor पर इंगित करते हैं, तो यह हमेशा आपके संपत्ति फ़ोल्डर (या कुछ) में पहली मीडिया फ़ाइल चलाता है।

आप ऐसा करते हैं: mMediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

तो यह सही फ़ाइल निभाता है।

+0

बहुत रोचक, जब मुझे मौका मिलता है तो मैं आपके सुझाव देने की कोशिश करता हूं! मैंने कभी संपत्तियों के बारे में कभी नहीं सुना था - क्या आप इस बारे में दस्तावेज़ीकरण के प्रासंगिक बिट के लिंक में डाल सकते हैं? धन्यवाद! –

7

डेटासोर्स बदलने से पहले Mediaplayer को रोकना और रीसेट करना सुनिश्चित करें। अधिक महत्वपूर्ण बात यह है पर जब आप इसे कॉल

onCompletion

रोक .. तो देखें कि आप इस विधि में क्या कर रहे हैं है। फिर फोन

mplayer.setDataSource(audioPath); 
mplayer.setOnPreparedListener(this); 
mplayer.prepareAsync(); 
संबंधित मुद्दे