2012-04-10 8 views
9

मैं एक एंड्रॉइड अलार्म एप्लिकेशन लिख रहा हूं जो अलार्म टोन खेलने के लिए सेवा का उपयोग करता है। वर्तमान में, मैं ऑडियो खेलने के लिए सक्षम हूं, लेकिन यह एक ऐसे रूप में चलता है जिसे डिवाइस की मात्रा को बंद करके म्यूट किया जा सकता है। इस प्रकार, मैं इसे रोकने के लिए setAudioStreamType(AudioManager.STREAM_ALARM); पर कॉल जोड़ने का प्रयास कर रहा हूं।(एंड्रॉइड मीडियाप्लेयर) अगर मैं MediaPlayer.create() को स्पष्ट रूप से कॉल() को कॉल करता हूं तो मुझे setAudioStreamType() को कॉल करने के लिए कैसे कहा जाता है?

मैं सेवा के लिए मेरे onStartCommand() समारोह के लिए निम्नलिखित है:

MediaPlayer mMP;  
@Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     try 
     { 
      mMP = MediaPlayer.create(this, R.raw.alarm); 
      mMP.setAudioStreamType(AudioManager.STREAM_ALARM); 
      mMP.setLooping(true); 
      //mMP.prepare(); commented out since prepare() is called in create 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     if (mMP != null) mMP.start(); 

     return START_STICKY; 
    } 

मेरे समस्या यह है कि setAudioStreamType करने के लिए कॉल() के साथ, MediaPlayer कभी नहीं ऑडियो खेलता है। अगर मैं उस लाइन को टिप्पणी करता हूं, तो ऑडियो बजाता है।

04-10 19: 32: ०३.११५: ई/MediaPlayer (3411): setAudioStream राज्य में कहा जाता है 8

में, मैं निम्नलिखित रनटाइम त्रुटि (रों) मिल लाइन के साथ

04-10 19: 32: ०३.११५: ई/MediaPlayer (3411): त्रुटि (-38, 0)

04-10 19: 32: ०३.११५: ई/MediaPlayer (3411): राज्य में बुलाया शुरू 0

04-10 1 9: 32: 03.115: ई/मीडियाप्लेयर (3411): त्रुटि (-38, 0)

04-10 19: 32: ०३.११५: ई/MediaPlayer (3411): त्रुटि (-38,0)

04-10 19: 32: ०३.११५: ई/MediaPlayer (3411): त्रुटि (- 38,0)

कुछ शोध (मैं अब लिंक नहीं मिल) ने मुझे बताया कि setAudioStreamType() के बाद prepare() बुलाया गया है नहीं कहा जा सकता, और create() परोक्ष कॉल prepare() कि।

किसी भी संबंध में, मुझे इस तरह की त्रुटि के बिना setAudioStreamType() कैसे माना जाता है?

उत्तर

12

या तो आप mp.reset() पर कॉल कर सकते हैं और फिर स्ट्रीम प्रकार, डेटा स्रोत सेट कर सकते हैं और फिर तैयार कर सकते हैं। वैकल्पिक रूप से केवल डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करें और प्रारंभिकरण को स्वयं संभालें।

संपादित करें:

Resources res = getResources(); 
AssetFileDescriptor afd = res.openRawResourceFd(R.raw.alarm); 

mp.reset(); 
mp.setAudioStreamType(AudioManager.STREAM_ALARM); 
mp.setLooping(true); 
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
mp.prepare(); 
mp.start(); 
+0

काम कर रहा है ऐसा लगता है कि आप इन पंक्तियों के साथ कुछ सुझाव दे रहे हैं जैसे ('(बनाने) को' कॉल के बाद शुरू): '' setAudioStreamType(); '' setLooping(); 'रीसेट()' 'तैयार();' क्या मैं सही हूँ? यदि ऐसा है, तो मुझे कॉल करने के लिए कॉल पर निम्न त्रुटि मिलती है: '04-10 20: 06: 25.515: ई/मीडियाप्लेयर (845): राज्य 1' ' 04-10 20: 06: 25.515: ई/मीडियाप्लेयर (845): त्रुटि (-38, 0) ' – finiteloop

+0

ऐसा लगता है कि आपको 'प्रारंभ()' वास्तव में, 'तैयार()' नहीं, कॉल पर त्रुटि मिल रही है। क्या आप अपना अद्यतन कोड प्रश्न में जोड़ सकते हैं? – kcoppock

+0

आप सही हैं, कॉल शुरू होने के बाद विशेष त्रुटि उत्पन्न हुई थी, कॉल करने में भी एक त्रुटि है कि जब मैं अपनी टिप्पणी पोस्ट कर रहा था तो लॉग में चूक गया। '04-10 21: 42: 11.8 9 6: ई/मीडियाप्लेयर (5 9 3): तैयार एसिंक राज्य 1' में बुलाया गया। – finiteloop

2

स्वीकृत जवाब एक IllegalStateException फेंक दिया गया था। यह

MediaPlayer mediaPlayer = new MediaPlayer(); 

try { 
    mediaPlayer.setDataSource(
      this, 
      getCustomToneUri() 
); 

    mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); 

    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     mp.start(); 
    } 
    }); 

    mediaPlayer.prepareAsync(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
संबंधित मुद्दे

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