2010-01-19 19 views
30

हैलो! स्टैक ओवरफ्लो पर यहां एक प्रश्न पूछने के लिए पहली बार। उत्तेजित करनेवाला! Haha।एंड्रॉइड में गतिविधियों में बीजी संगीत बजाना

हम एक एंड्रॉइड गेम विकसित कर रहे हैं और हम अपने परिचय के लिए कुछ पृष्ठभूमि संगीत बजाते हैं (हमारे पास एक परिचय गतिविधि है) लेकिन हम चाहते हैं कि यह अगली गतिविधि में खेलना जारी रखे, और शायद संगीत को रोकने या चलाने में सक्षम हो आवेदन के भीतर कहीं से भी।

इस समय हम जो कर रहे हैं वह हमारी परिचय गतिविधि पर मीडियाप्लेयर का उपयोग करके बीजीएम खेलता है। हालांकि, जैसे ही उपयोगकर्ता उस गतिविधि को छोड़ देता है, हम संगीत को रोकते हैं। क्या हमें इसके लिए सेवाओं की तरह कुछ उपयोग करना है? या MediaPlayer/SoundPool पर्याप्त है? अगर कोई जवाब जानता है, तो हम खुशी से हमारे साथ साझा करने की सराहना करेंगे। धन्यवाद!

+1

मैं अभी भी एक ही मुद्दे पर आया हूं, और यह सोच रहा था कि संगीत को कब रोकना है? यदि आप डेस्ट्रॉय पर सेवा को रोकते हैं तो यह सबैक्टिविटीज के बीच इसे रोक देगा - संगीत को रोकने के लिए आखिरी गेम गतिविधि बंद होने पर आप कैसे जानते हैं? – Tom

उत्तर

13

इसके लिए सेवाओं का उपयोग करके मेरे अनुभव में एक बहुत अच्छा विचार नहीं है।

पृष्ठभूमि सेवा का उपयोग कर के बिना संगीत:

http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion

+1

यह कुछ समय हो गया है क्योंकि मैंने यह प्रश्न पोस्ट किया था। जब हमें समाधान मिला तो मुझे इसे अपडेट करना चाहिए था। सेवा के बजाए एक स्थिर संगीत प्रबंधक का उपयोग इस के लिए सबसे अच्छा विकल्प प्रतीत होता है। वास्तव में आपके द्वारा पोस्ट किया गया लिंक बिल्कुल वही है जिसे हम इसे आधारित करते हैं। भगवान आशीर्वाद रॉबर्ट ग्रीन। – jhie

+0

सेवाएं यहां एक अच्छा विचार क्यों नहीं हैं? – codeulike

+6

शायद मैंने इसे छोड़ दिया जब मैंने कोड छोड़ा, लेकिन ऐसा लगता है कि यह यूआई थ्रेड में संगीत प्रबंधक चलाता है। यह अच्छा डिजाइन नहीं है। एएनआर बल बंद होने से बचने के लिए संगीत और अन्य (संभावित रूप से) गहन संचालन यूआई थ्रेड में नहीं किया जाना चाहिए। यह पहले एंड्रॉइड डेवलपर मार्गदर्शकों में से एक में शामिल है: http://developer.android.com/guide/components/processes-and-threads.html# थ्रेड्स अन्य उत्तरों को देखें जो सही उदाहरणों के लिए थ्रेडिंग को संबोधित करते हैं। – CatShoes

2

अगर मैं अपनी स्थिति सही ढंग से समझ, तो मैं एक ही समस्या कई बार उसे सामना करना पड़ा। मैं अपने अनुप्रयोगों में संगीत चलाने के लिए एक अलग थ्रेड का उपयोग कर रहा हूं। यह कार्यान्वयन उस संदर्भ के लिए एक स्थिर संदर्भ को पारित करता है जो मुझे पता चलेगा कि संगीत कब खेलेंगे।

public class AudioPlayer extends Thread { 
private Context c; 
private Thread blinker; 
private File file; 

public AudioPlayer (Context c, File file) { 
    this.c = c; 
    this.file = file; 
} 

public void go() { 
    blinker = this; 
    if(!blinker.isAlive()) { 
     blinker.start(); 
    } 
} 

public void end() { 
    Thread waiter = blinker; 
    blinker = null; 
    if (waiter != null) 
     waiter.interrupt(); 
} 

public void run() { 
    MediaPlayer ap = MediaPlayer.create(c, Uri.fromFile(file)); 
    int duration = ap.getDuration(); 
    long startTime = System.currentTimeMillis(); 
    ap.start(); 
    try { 
     Thread thisThread = Thread.currentThread(); 
     while (this.blinker == thisThread && System.currentTimeMillis() - startTime < duration) {   
      Thread.sleep (500); // interval between checks (in ms) 
     } 
     ap.stop(); 
     ap.release(); 
     ap = null; 
    } catch (InterruptedException e) { 
     Log.d("AUDIO-PLAYER", "INTERRUPTED EXCEPTION"); 
     ap.stop(); 
     ap.release(); 
     ap = null; 
    } 
    } 
} 
1

आप AsyncPlayer उपयोग करने का प्रयास कर सकते हैं लेकिन आप खेल से ध्वनि को रोकने के लिए वर्ग के लिए एक संदर्भ रखना चाहिए।

आप Uri uri = Uri.parse("android.resource://com.stackoverlof.android/raw/ beep.mp3"); का उपयोग कर स्थानीय संसाधन में उरी बना सकते हैं।

उम्मीद है कि इससे मदद मिलती है।

9

आप एक सेवा भी बना सकते हैं जो नीचे दिए गए मध्यस्थ का उपयोग करके संगीत चलाएं।

Intent svc=new Intent(this, BackgroundSoundService.class); 
startService(svc); //OR stopService(svc); 

public class BackgroundSoundService extends Service { 
    private static final String TAG = null; 
    MediaPlayer player; 
    public IBinder onBind(Intent arg0) { 

     return null; 
    } 
    @Override 
    public void onCreate() { 
     super.onCreate(); 


     player = MediaPlayer.create(this, R.raw.idil); 
     player.setLooping(true); // Set looping 
     player.setVolume(100,100); 

    } 
    public int onStartCommand(Intent intent, int flags, int startId) { 


     player.start(); 

     return 1; 
    } 

    public void onStart(Intent intent, int startId) { 
     // TODO 



    } 
    public IBinder onUnBind(Intent arg0) { 
     // TODO Auto-generated method stub 

     return null; 
    } 

    public void onStop() { 

    } 
    public void onPause() { 

    } 
    @Override 
    public void onDestroy() { 

     player.stop(); 
     player.release(); 
    } 

    @Override 
    public void onLowMemory() { 

    } 
} 
4

एक स्थिर SoundManager या तो SoundPools या मीडिया प्लेयर्स का उपयोग कर बनाएँ।

KeepMusicGoing नामक एक स्थिर ध्वज बनाएं।

पहली सक्रियता बनने पर संगीत प्रारंभ करें।

कार्यवाही स्विच करते समय KeepMusicGoing को सही पर सेट करें।

अपनी गतिविधियों की ऑनस्टॉप घटना पर जांचें कि क्या रखें म्यूजिकगोइंग सत्य है, अगर ऐसा है तो संगीत को छोड़ दें, फिर रखेंMusicGoing को झूठी पर सेट करें।

यदि वे होम बटन दबाते हैं तो KeepMusicGoing ध्वज झूठा होगा, इसलिए जब गतिविधि फोकस हो जाती है तो संगीत बंद हो जाएगा।

मुझे ईमेल और मैं तुम्हें एक जोड़े SoundManagers कि मैंने लिखा एक मीडिया प्लेयर्स और अन्य SoundPools

चाड

+1

हां, यह भी हमने यह कैसे किया। vladikoff ने लिंक पोस्ट किया जहां हमें संगीत के लिए एक स्थिर प्रबंधक का उपयोग करने का विचार मिला। – jhie

+0

हे चाड आप मुझे उन उदाहरण भेज सकते हैं। मेरा ईमेल आईडी [email protected] है। – Sourabh

+0

मैं इस दृष्टिकोण के साथ एक समस्या में भाग गया हूँ। मेरा ऐप घूर्णन का समर्थन करता है और जब डिवाइस को घुमाया जाता है तो स्टॉप को कॉल किया जाता है और जब उपयोगकर्ता घर दबाता है तो इसे भी बुलाया जाता है। घूर्णन करते समय मैं संगीत को रोकना नहीं चाहता लेकिन जब घर दबाया जाता है तो मैं नहीं जानता, घटनाओं को अलग करने के तरीके, किसी भी विचार को कैसे नहीं? – marchinram

0

सबसे पहले मैं विधि का इस्तेमाल किया जहां चाड द्वारा प्रदान की एक "keepMusicPlaying" झंडा रखने के लिए करता भेज सकते हैं।मुझे लगता है कि बस अपनी गतिविधियों के ऑनस्टार्ट और ऑनटॉप विधियों का उपयोग करने के लिए यह अधिक सुरुचिपूर्ण है।

अपनी खुद की कक्षा "SoundManager" बनाएं और स्टार्ट और ऑनस्टॉप (या बेस गतिविधि वर्ग का उपयोग करें) पर अपनी सभी गतिविधियों से कुछ ऑनस्टार्ट और ऑनस्टॉप क्लास को कॉल करें। स्टार्ट काउंटर (ऑनस्टार्ट में स्टार्ट काउंटर ++ और स्टार्ट काउंटर - ऑनस्टॉप में) के साथ ऑनस्टार्ट और ऑनस्टॉप का ट्रैक रखें। चूंकि पुरानी गतिविधि के ऑनटॉप से ​​पहले एक नई गतिविधि की शुरुआत को बुलाया जाता है, तो आप हमेशा जानते हैं कि ऑनस्टार्ट को पहली बार (startCounter == 1) कहा जाता है या आपकी किसी अन्य गतिविधि से शुरू होता है (startCounter == 2)। ऑनस्टॉप के साथ ही (startCounter == 0 का अर्थ है कि ऐप बंद था, startCounter == 1 का मतलब है कि यह सिर्फ पुरानी गतिविधि से रोक है लेकिन एक नया है)।

इस तरह आप अपने ऐप के अंदर शुरू होने वाली प्रत्येक गतिविधि पर कुछ KeepMusicPlaying विधि/ध्वज को कॉल करने के बजाय अपने SoundManager में सबकुछ को समाहित करते हैं।

public void OnStart() 
    { 
     startCounter++; 
     if (startCounter == 1) 
     { 
      //start music here 
     } 

    public void OnStop() 
    { 
     startCounter--; 
     if (startCounter == 0) 
     { 
      // stop music here 
     } 
    } 
0

मेरे library पृष्ठभूमि मीडिया प्लेबैक के रूप में संभव के रूप में सरल बनाने के लिए डिजाइन किया गया था। स्रोत को देखने का प्रयास करें, या यदि आप चाहें तो लाइब्रेरी का उपयोग करें।

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