3

音楽プレーヤーアプリを作成しています。

その中で、アプリケーションが AudioFocus を失ったかどうかを確認していると、再生が停止します。しかし、これは、トラックを再生してから停止してから再度トラックを再生するswitch case AudioManager.AUDIOFOCUS_LOSS と、フォーカスが失われているためにプレーヤーを停止したときに呼び出されるという 1 つの問題を引き起こしています。

そのため、自分のアプリはそれ自体にフォーカスを失っています。明らかに、これらは私の意図ではありませんでした。他の音楽プレーヤーがフォーカスを要求したときに呼び出されるようにしたかったのです。

private OnAudioFocusChangeListener focusChangeListener = new OnAudioFocusChangeListener() {
    @Override
    public void onAudioFocusChange(int focusChange) {
        switch (focusChange) {
        case AudioManager.AUDIOFOCUS_LOSS:

            if (mPlayer.isPlaying()) {
                stopPlayback();
            }
            break;
        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
            if (mPlayer.isPlaying()) {
                mPlayer.pause();
            }
            break;
        case AudioManager.AUDIOFOCUS_GAIN:
            if (!mPlayer.isPlaying()) {
                initiatePlayback();
            }
            break;
        }
    }
};

もう 1 つ問題があります。取得していた例外は ですIllegalStateException

これは、コードが内部に到達したときにcase AudioManager.AUDIOFOCUS_LOSS、私の音楽プレーヤーが何らかのエラー状態にあることを意味します。それを確認するために、次OnErrorListenerを使用して登録しました:

//Inside Service - onCreate() Method
mPlayer.setOnErrorListener(mErrorListener);

しかし、このリスナーが呼び出されることはありません。どんな助けにも感謝します。

4

2 に答える 2

7

私は同様の問題を抱えていfocusChangeListenerました。プログラムのどこかであなたが再作成されているのではないかと強く疑っていますfocusChangeListener. サービスまたはアクティビティから定義していますか?

アイデアは、 andに渡すyourの単一のコピーを維持することです。そうしないと、AudioManager は別のソースからの要求を考慮するため、アプリがそれ自体にフォーカスを失う可能性があります。focusChangeListenerrequestAudioFocus()abandonAudioFocus()

requestAudioFocus() 同じリスナー オブジェクトを何度も呼び出しても登録されるのは 1 回だけでabandonAudioFocus()あり、オーディオ フォーカスを解放するには 1 回の呼び出しで十分であることを知っておく必要があります。

問題を解決できるいくつかの提案:

  • focusChangeListener静的オブジェクトとして定義してみて、ヘルプがあるかどうかを確認してください。

  • リスナーがアクティビティに登録されている場合は、リスナーがより長く存続できるように、サービスへの移行を検討してください。

  • この問題をデバッグするには、フォーカスを要求または放棄するたびに次の ** をログに記録して、同じインスタンスを処理していることを確認すると非常に役立ちます。

    • あなたの focusChangeListener などfocusChangeListener.hashCode()
    • 現在のコンテキスト オブジェクトなどcontext.hashCode()
    • 現在のスレッド ID などThread.currentThread().getId()

例えば:

  Log.d(TAG, String.format("Request audio focus: thread id = %s, context = %s, listener = %s",Thread.currentThread().getId(),context.hashCode(),focusChangeListener hashCode())

編集:

アプリケーションコンテキストを使用getApplicationContext()すると、問題も解決できます。

于 2013-01-02T20:55:31.087 に答える
1

残念ながら、IllegalStateExceptionsはOnErrorListener呼び出しをトリガーしません。IllegalStateExceptionsがトリガーされる可能性のあるコードの一部を試して、キャッチする必要があります。

于 2012-09-26T08:30:32.193 に答える