0

MainActivityでは、MediaPlayerを使用してバックグラウンドミュージックを再生します。

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    Music.playBGmusic(this, R.raw.main_music);
}

@Override
protected void onResume() {
      super.onResume();
      if ( ! Music.isPlaying(this) )
      {
          Music.playBGmusic(this, R.raw.main_music);
      }
}

Music.javaの場合:

public class Music {
   private static MediaPlayer mMainSound = null;
   public static boolean isPlaying(Context context)
   {
       if ( mMainSound != null )
       {
           return mMainSound.isPlaying();
       }
       return false;
   }

   public static void playBGmusic(Context context, int resource)
   {
       if ( mMainSound != null ) mMainSound.release();
       mMainSound = MediaPlayer.create(context, resource);
       mMainSound.setLooping(true);
       mMainSound.start();
   }

   public static void stopBGmusic(Context context) {
       if (mMainSound != null) {
           mMainSound.stop();
           mMainSound.release();
           mMainSound = null;
       }
   }
}

mMainSoundMediaPlayerオブジェクトはどこにありますか。MainActivityにボタンがあり、クリックするとインテントとstartActivityそのインテントが作成されます。この新しいアクティビティはplayBGmusic別のサウンドで呼び出します。これで、その新しいアクティビティが呼び出さstopBGmusic() finish()てMainActivityに戻ると、onResume()MainActivityのが期待どおりに呼び出され、バックグラウンドで再生main_musicされることになっています。実際に起こっているのは、音楽が1秒未満しか聞こえず、途切れてしまうことです。MediaPlayerを起動する前に試してみましprepare()たが、それでも問題は解決しません。誰かが私のためにこの問題を明確にすることができれば非常にありがたいです。

finish()それが重要かどうかはわかりませんが、新しいアクティビティのどこで呼び出されるかについても言及する必要があります。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    switch(keyCode)
    {
        case KeyEvent.KEYCODE_BACK:
            showDialog(1);
        break;
    }
    return true;
}  

@Override
protected Dialog onCreateDialog(int id) { //id is ignored
    Dialog dialog = null;
    AlertDialog.Builder builder;
    builder = new AlertDialog.Builder(this);
    builder.setMessage(R.string.return_home)
           .setCancelable(true)
           .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   finish();
               }
           })
           .setNegativeButton(R.string.cancel, null);
    dialog = builder.create();
    return dialog;
}
4

1 に答える 1

0

MediaPlayerを制御するには、実際にサービスをバインドする必要があります。メインのアクティビティで制御する必要はありません。代わりに、サービスをアプリにバインドすることでサービスを制御する必要があります。

簡単に言うと(アプリを終了しても音楽を継続的に再生したい場合):

音楽を再生しているときは、バックグラウンドで実行し、メディアプレーヤーの状態をアプリで制御(開始/停止/一時停止)します。メディアプレーヤーを作成するときは、フォアグラウンドではなくバックグラウンドから再生します。これにより、ユーザーがサービスを実行している間、音楽を継続的に再生できます。

通信は、PendingIntentを使用してセットアップし、特定のインテントフィルターをキャプチャしてサービスと通信することができます。Googleの開発サイトにアクセスしてチュートリアルをいくつか実行し、インテント、インテントフィルター/アクション、およびサービスの方法を学び、アクティビティとサービスのライフサイクルを学ぶことをお勧めします。

これを適切に行うには、Androidについて調査/実験し、学習するために時間を割り当てる必要があります。

于 2013-01-31T01:07:22.143 に答える