2012-06-30 10 views
5

Başlık, bu sesin çok daha basit olmasını sağlıyor .. Çoğu müzik çaları duraklatacak bir niyet yayınlamaya çalışıyorum.Bilgisayarda Medya Oynatma Sisteminde Güvenilir Duraklatma Sistem Genişliğinde

long eventTime = SystemClock.uptimeMillis(); 
    Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null); 
    KeyEvent downEvent = new KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0); 
    downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent); 
    ctx.sendOrderedBroadcast(downIntent, null); 

Ve bu işleri:

O bununla KEYCODE_MEDIA_PLAY_PAUSE yayınlayacak için bir KeyEvent oluşturmak kullanabilirsiniz biliyorum. Stok medya oynatıcısını, kulaklık oynatma/duraklatma düğmelerini destekleyen diğer müzik çalarlarla birlikte, onu nasıl istediğimi duraklatacaktır. Ama bir sebepten dolayı, sadece bir kez stok müzik çalar ile çalışır. Bunu aramak için düğmeye basabilirim ve müziği duraklatır. Tekrar oynatmaya başlarsam ve tekrar duraklatma düğmesine basarsam işe yaramıyor. Cihazı yeniden başlattığımda tekrar çalışır. Ama sonra Pandora ile, gerektiği gibi tutarlı bir şekilde çalışır.

Bu konuda çalışabileceğimi ve sadece bir KeyEvent kullanmadan durabileceğimi düşündüm. Ben AudioManager ve başka niyetiyle bu çalıştı:

AudioManager mAudioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);  
    if (mAudioManager.isMusicActive()) { 
     Intent mediaIntent = new Intent("com.android.music.musicservicecommand"); 
     mediaIntent.putExtra("command", "pause"); 
     ctx.sendBroadcast(mediaIntent); 
    } 

Ve bu da çalışır ve sürekli çalışır. Ama doğal olarak kırılgan, çünkü doğrudan Android müzik çalara göndererek, onunla çalışacağı tek oyuncudur. Pandora, Last.FM vb. Kontrolü yok ve çoğu müzik çaları ile çalışmam gerekiyor.

Sadece nereye gideceğime emin değilim. Çalıştığı sürece ne tür bir çözümün verildiği konusunda seçici değilim. KeyEvent'in çalışmasına yardımcı olabilirseniz, fantastik, tamamen farklı bir çözümünüz varsa, fantastik. Sadece çalışmasını istiyorum! Teşekkürler!

+0

Burada yaptığınız her şey "doğal olarak hassas" olur. Üstelik, bu etkinliği tamamen göz ardı edecek pek çok medya oyuncusu da olacak. Ve bir gün OS'nin, "ACTION_MEDIA_BUTTON" olaylarını sahte diğer benzer olayları engellemelerini engellemeye başlaması tamamen olasıdır. Kendi medya oynatıcınızı yazıyorsanız, ses odağını elde etmek için 'AudioManager' içindeki ses netleme özelliklerini kullanın. – CommonsWare

+0

Aslında kendi medya oynatıcımı yazılamıyorum. Play Store'da belirli bir süre sonra müziği durduracak pek çok tam işlevli uygulama olduğunu biliyorum, ancak bunlardan hiçbiriyle özellikle memnun değilim. Sadece kendi başıma bir şeyler yazmayı deniyorum ve çoğu müzik uygulamasını duraklatabilmem gerekiyor. – Geniusdog254

cevap

2

Sistem sesini duraklatmak için, bir amaç başlatmaz, bunun yerine sistemden ses odaklama isteğinde bulunmazsınız.

//The Variables we'll need to create 
AudioManager am; 
OnAudioFocusChangeListener af; 

//I do nothing with this listener, but it's required for the next step. 
af = new OnAudioFocusChangeListener() { 

     public void onAudioFocusChange(int focusChange) { 
      if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { 
       // Lower the volume 
      } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { 
       // Raise it back to normal 
      }  
     } 

}; 

//Do the actual pause 
am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
int request = am.requestAudioFocus(af, 
    AudioManager.STREAM_MUSIC, 
    AudioManager.AUDIOFOCUS_GAIN); 

Ama kullanarak odak gitmesine izin unutmayın: her şeyi aşağıdakileri yapın duraklatmak istediğinizde

Yani (onCreate önerildiği)

am.abandonAudioFocus(af); 
+0

Eğer dinleyicinin içinde/dışında olanlar sadece Android'in belgelerinden kopyalanır ve hiçbir şey yapmazsanız, bunları kaldırabilirsiniz. –

4

Bu karşılaştım de. Açıklamanız sayesinde, neler olduğunu anlıyorum. Keydown olayını gönderirsiniz, ancak sisteme hiçbir zaman anahtarlama işlemi, oynatma/duraklatma düğmesine sürekli basıldığını düşünmez. Bu kod parçasını başarıyla kullandım.

Intent mediaEvent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); 
mediaEvent.putExtra(Intent.EXTRA_KEY_EVENT, event); 
context.sendBroadcast(mediaEvent); 

new Timer().schedule(new TimerTask() { 
    @Override 
    public void run() { 
     Intent mediaEvent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
     KeyEvent event = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_MEDIA_PLAY); 
     mediaEvent.putExtra(Intent.EXTRA_KEY_EVENT, event); 
     context.sendBroadcast(mediaEvent); 
    } 
}, 100); 
İlgili konular