知識社群登入
位置: 艾鍗學院 Blog > 專業論壇 > 討論
[Android實作問題] how to listener another media player and a question
1樓
Hello Jarey,

1. 請教,當一個app開啟一個media player(如音樂播放器)時若另再開啟另一個 media player(如音樂播放器)時那第一個
    media player要如何知道另一個已開啟並且關掉自已

2. 我有做一個headset hook key的receiver但一直存在一個問題很不解,就是當我只按了一下headset hook key (耳機上的hook鍵)但它會接收二次訊息,為什麼呢? 只按了一次但程式一直接收二次,程式碼如下
    
public class MediaButtonReceiver extends BroadcastReceiver
{
private static final String TAG = MediaButtonReceiver.class.getSimpleName();

@Override
public void onReceive(Context context, Intent intent)
{
StringBuffer sb = new StringBuffer();
if(!(Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()))) return;
KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if(event == null) return;
if(event.getKeyCode() == KeyEvent.KEYCODE_HEADSETHOOK)
{
sb.append("KEYCODE_HEADSETHOOK");
Toast.makeText(context, sb.toString(), Toast.LENGTH_SHORT).show();
Log.i(TAG, sb.toString());
}
     }
}

LogCat的輸出(只按了一次key但會出現二次)
12-23 11:37:47.643: INFO/MediaButtonBroadcastReceiver(4341): KEYCODE_HEADSETHOOK
12-23 11:37:47.773: INFO/MediaButtonBroadcastReceiver(4341): KEYCODE_HEADSETHOOK
這會key的bounce要做debounce嗎?若是那要如何做debounce?


thank you
小K

2樓
1. 請教,當一個app開啟一個media player(如音樂播放器)時若另再開啟另一個 media player(如音樂播放器)時那第一個
    media player要如何知道另一個已開啟並且關掉自已

一般media player如果是設計掛在Activity元件上,那麼你應該在Activity生命週期裡去管理該media player的播放生命週期,

media player為你自己在同一個activity頁面所開啟的,自然不會有同時開兩個又不知第一個如何關.

另一種是你是不同的頁面要去使用播放音樂功能,那麼你應該在另外設計一個service元件,將media player播放音樂的功能

寫在service裡面,這樣不同的activity元件可以透過bind與service溝通,你在設計一套自己的通訊協定或函式呼叫流程,自然

就可以管理media player的播放了.


2. 我有做一個headset hook key的receiver但一直存在一個問題很不解,就是當我只按了一下headset hook key (耳機上的hook鍵)但它會接收二次訊息,為什麼呢? 只按了一次但程式一直接收二次,程式碼如下

我沒有特別去試過 KEYCODE_HEADSETHOOK這個Action,不過你可以試看看,或許是播下與放開按鈕都會觸放event,才會

造成兩次的呼叫,也或是按鈕本身有所彈跳造成。 這要看你收到這個事件後你想做事情是什麼,基本上因為Receiver的函式本

身也是跑在Main thread之中,所以你在onreciever函式中若事情還沒有處理完,第二個事件是不會進去的,會卡住排隊,因為

都是跑在同一個Main thread之中。
3樓
Hello Jaery,

1. 一個media  player 是自己的,但另外一個media player是系統預設的 media  player,我的media player要如何知道
其它的程式己經開啟來了?

2. 這第二個問題已解決,它的確為判讀二次(按下去一次 , 釋放(放開)一次), 當我將程式碼增加了一個判別式後,就只列印一次了 ^_^
    if(event.getAction() != KeyEvent.ACTION_UP) return;

Thank you
Kent
4樓
由於Android每個APP都是跑在獨立的PIC與DVM中,基於安全考量你無法直接去存取其它的應用程式,

若想要得知其它應用程式的media player播放的狀況,就只能看對方應用程式是否有放什麼廣播出來給你判斷,

但如果對方的APP是先播放的.也沒有放任何的廣播對外或是提供service給其它APP控制,那麼你是無法去

取得資訊。

主要看你想要偵測的系統預設的media player是什麼應用,是在播什麼東西,然後你去找看看有沒有對應的

一些廣播狀態可以收。

5樓
I see, I will continue to try, thank you for your help!