4

特定の MediaPlayer の問題に対する解決策を見つけるために、ほぼ 1 日を費やしました。ユーザーがアプリ内でアクティビティを切り替えたときに MediaPlayer のオーディオを再生し続け、別のアプリ (ホーム ボタン、最近のアプリ ボタンなど) に切り替えると停止し、アプリが再びフォーカスされると再開するようにしたいと考えています。ただし、この方法で機能するソリューションを取得できないようです。どこから始めればよいかわからないというわけではありませんが、私が試した解決策はどれも複雑で、結局うまくいきませんでした。アクティビティがアクティビティの切り替えを停止したとき、およびアプリがフォーカスを失ったときにアプリが通知できるようにする必要があるようです。

このような状況が非常にまれであり、それを解決するためのきちんとしたエレガントなソリューションが存在しないとは想像できません。誰でも私がそれを理解するのを手伝ってもらえますか? ありがとうございました!

4

3 に答える 3

4

アクティビティ間で MediaPleer を共有する最良の方法は android Service だと思います。MediaPlayer を保持する Service を作成します。アクティビティは onResume でサービスにバインドし、onPause でバインドを解除します。サービスは、誰かがバインドされているかどうかを常に認識しています。したがって、誰もバインドされていない場合 (実行中のアクティビティがない場合)、再生が停止します。グーグル「サービスからのアンドロイドMediaPlayer」

于 2012-12-30T08:16:24.963 に答える
3

インテントフィルターを使用して、目的のアクションやキーの押下(ホームボタンなど)をリッスンするサービスBroadcastReceiverを実装する必要があります。Androidメディアプレーヤーのソースは、ここからダウンロードできます。確認したい2つのクラスは、MediaButtonIntentReceiverMediaPlaybackServiceです。

于 2012-12-30T09:36:06.840 に答える
0

サービスは、行く方法かもしれません。サービスの有無にかかわらず、多くの場合、設計したプログラムが本来あるべきほど堅牢ではないことを示している可能性があります。サービスを作成したとしても、いつ一時停止し、いつ再開するかを知る必要があります。

アプリ全体を適切にリファクタリングせずに、より優れたアプリケーションエンジンを使用することなく、機能するように見える単純なソリューションを実装しました。

音楽を開始する最初のアクティビティで mediaPlayer を開始した後:

最初のアクティビティと後続の各アクティビティで、メンバー変数を作成します。 private boolean mStopTheMusic = true;

次に、音楽の再生を継続したり、適切に停止したりする各アクティビティで、次をオーバーライドします: (注: 適切に停止するのは、自分のアプリではなく他のアプリがフォアグラウンドになったときです。これらは音楽を停止する適切なタイミングです) そしていつでも現在のアクティビティの上に新しいアクティビティをプログラムで開始し、mStopTheMusic = false を設定して、バックグラウンド ミュージックが停止しないようにします。

    @Override 
    public void onResume()
    {
        super.onResume();

        mStopTheMusic  = true;
        if (!MusicPlayer.IsMusicPlaying())
            MusicPlayer.StartMusic();  
    }

    @Override
    public void onPause() 
    {      
        super.onPause();
        if (mStopTheMusic)
          MusicPlayer.PauseMusic(); 
    }

   @Override 
   public void onBackPressed()
   {        
       mStopTheMusic = false;
       super.onBackPressed();   
   }
于 2014-06-04T23:52:51.620 に答える