2012-06-30 15 views
5

タイトルは、このサウンドをはるかに簡単にします。私は、ほとんどの音楽プレーヤーを一時停止する意図をブロードキャストしようとしています。Androidでシステム全体を確実に一時停止する

私は、私はそれがこれでKEYCODE_MEDIA_PLAY_PAUSEをブロードキャストするためにKeyEventを作成し使用することができます知っている:

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

そして、それが動作します。ヘッドフォンの再生/一時停止ボタンをサポートする他のほとんどの音楽プレーヤーと一緒に、在庫メディアプレーヤーを私が望む方法で一時停止します。しかし何らかの理由で、株式音楽プレーヤーで一度しか動作しません。私はこれを呼び出すためにボタンを押すことができ、それは音楽を一時停止するでしょう。もう一度再生を開始して一時停止ボタンをもう一度押すと、機能しません。デバイスを再起動すると、もう一度動作します。しかし、Pandoraでは、それは一貫して動作するはずです。

私はそれを回避でき、KeyEventを使用せずに一時停止できると思っていました。私はAudioManagerと別の目的でこれを試しました:

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

これはまた動作し、一貫して動作します。しかし、本質的に壊れやすいのは、Androidの音楽プレーヤーにインテントを直接送信することで、それが動作する唯一のプレーヤーだからです。 Pandora、Last.FMなどのコントロールはありません。ほとんどの音楽プレーヤーで動作する必要があります。

私は次のどこに行くのか分かりません。私はそれが働く限り、私がどのような解決方法を与えられているのかぞっとするつもりはない。まったく別のソリューションがあれば、KeyEventの仕事を幻想的にする手助けができれば、素晴らしい。私はそれがうまくいってほしい!ありがとう!

+0

あなたがここで行うことは、「本質的に壊れやすい」ものです。さらに、このイベントを完全に無視するメディアプレーヤーがたくさんあります。そして、いつかOSが偽の 'ACTION_MEDIA_BUTTON'イベントを他の類似した偽のイベントをブロックするようにブロックすることは完全に可能です。独自のメディアプレーヤーを作成する場合は、オーディオフォーカスを取得するためにAudioManagerのオーディオフォーカス機能を使用します。 – CommonsWare

+0

私は自分のメディアプレーヤーを実際に書いているわけではありません。 Playストアには、設定した時間が経過しても音楽を停止する完全機能のアプリがたくさんあることはわかっていますが、そのうちのどれにも特に満足しているわけではありません。私はちょうど私自身のテイクを書くことを試みているだけで、ほとんどの音楽アプリを一時停止できる必要があります。 – Geniusdog254

答えて

2

システムワイドオーディオを一時停止するには、インテントを開始するのではなく、オーディオフォーカスをシステムから要求します。

あなたはすべてを一時停止したいときに(のonCreateで提案されている)次の操作を行います

//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); 

しかし、使用してフォーカスを手放すことを忘れないでください:

am.abandonAudioFocus(af); 
+0

リスナー内のこれらの/ elseは、Androidのドキュメントからコピーされただけで、何もしない場合は削除できます。 –

4

私は、この全体に走りました同じように。あなたの説明のおかげで、何が起こっているのか分かりました。 keydownイベントを送信しますが、キーアップは決してシステムには再生/一時停止ボタンが継続的に押されているとみなされることはありません。私はこのコードをうまく使いました。

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); 
関連する問題