2012-04-10 15 views
9

Alarm tonunu çalmak için bir Servis kullanan bir Android alarm uygulaması yazıyorum. Şu anda, çalınacak sesi alabiliyorum, ancak cihazın sesini kısarak susturulabilecek bir formda çalıyor. Bu nedenle, bunu önlemek için setAudioStreamType(AudioManager.STREAM_ALARM); numaralı telefona bir arama eklemeye çalışıyorum.(Android MediaPlayer) MediaPlayer.create() implicitly prepare() çağırırsa setAudioStreamType() nasıl çağırmalıyım?

Ben hizmet için benim onStartCommand() fonksiyonu için aşağıdaki vardır:

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; 
    } 

Benim sorunum setAudioStreamType() çağrısı ile, MediaPlayer asla ses oynuyor. Bu çizgiyi yorumlarsam, ses çalar.

04-10 19: 32: 03,115 E/MediaPlayer (3411): halde adı setAudioStream 8

, aşağıdaki çalışma zamanı hatası (ler) elde hattı ile

04-10 19: 32: 03,115 E/MediaPlayer (3411): hata (-38, 0)

04-10 19: 32: 03,115 E/MediaPlayer (3411): halde adı başlar 0

04-10 19: 32: 03.115: E/MediaPlayer (3411): error (-38, 0)

04-10 19: 32: 03,115 E/MediaPlayer (3411): Hata (-38,0)

04-10 19: 32: 03,115 E/MediaPlayer (3411): Hata (- 38,0)

Bazı araştırmalar (şimdi linki bulamıyorum) setAudioStreamType()prepare() çağrıldıktan sonra denir ve create() örtük prepare() çağırır edilemez olduğunu söyledi.

Herhangi bir bakımdan, böyle bir hata olmadan nasıl setAudioStreamType() yapmalıyım?

cevap

12

mp.reset() numaralı telefonu arayabilir ve ardından akış türünü, veri kaynağını ayarlayabilir ve hazırlayabilirsiniz. Alternatif olarak sadece varsayılan kurucuyu kullanın ve başlatmayı kendiniz halledin.

DÜZENLEME:

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

çalışıyor (') (oluşturmak' çağrısının başlayarak):; '' setAudioStreamType(); '' setLooping(); ') (reset' Hazırla(); Doğru muyum? Eğer öyleyse, hazırlanmak için çağrıda şu hatayı alıyorum: '04-10 20: 06: 25.515: E/MediaPlayer (845): durum 1 'den başlamaya başlayın' ' 04-10 20: 06: 25.515: E/MediaPlayer (845): error (-38, 0) ' – finiteloop

+0

'begin()' aslında, hazırlamama() 'deyimini çağırıyorsunuz gibi görünüyor. Güncellenmiş kodunuzu soruya ekleyebilir misiniz? – kcoppock

+0

Haklısınız, çağrı başlatıldıktan sonra o belirli bir hata ortaya çıktı, ayrıca benim yorumumu gönderdiğimde günlüğümü kaçırdığım için hazırladığım bir hata da var. 04-10 21: 42: 11.896: E/MediaPlayer (593): readyAsync durumu 1 'olarak adlandırılır. – finiteloop

2

Kabul cevabı bir IllegalStateException atıyordu. Bu, bu satırlar boyunca bir şey düşündüren gibi geliyor

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(); 
} 
İlgili konular