6

タイトルは、このサウンドを実際よりもはるかに単純にします..ほとんどの音楽プレーヤーを一時停止するインテントをブロードキャストしようとしています。

私はこれで 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);

そして、それは機能します。ヘッドフォンの再生/一時停止ボタンをサポートする他のほとんどの音楽プレーヤーと同様に、ストックメディアプレーヤーを希望どおりに一時停止します. しかし、何らかの理由で、ストックミュージックプレーヤーで1回しか機能しません。ボタンを押してこれを呼び出すと、音楽が一時停止します。もう一度再生を開始して、もう一度一時停止ボタンを押しても、機能しません。デバイスを再起動すると、再び機能します。しかし、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 を機能させるのを手伝っていただければ、素晴らしいです。まったく別のソリューションがあれば、素晴らしいです。私はそれを機能させたいだけです!ありがとう!

4

3 に答える 3

5

私もこれに出くわしました。あなたの説明のおかげで、何が起こっているのか理解できたと思います。キーダウンイベントを送信しますが、キーアップは送信しないため、システムは再生/一時停止ボタンが連続して押されていると見なします。私はこのコードをうまく使いました。

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);
于 2013-05-10T02:30:05.530 に答える
3

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

したがって、すべてを一時停止したい場合は、次のようにします (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);
于 2012-08-22T23:53:31.137 に答える