web-dev-qa-db-ja.com

MediaPlayer、生リソース、停止と開始に関する問題

私はAndroid開発に不慣れです。質問/問題があります。

MediaPlayerクラスをいじって、サウンドや音楽を再生しています。私は生のリソース(_res/raw_)をプレイしていて、それはちょっと簡単に見えます。

Rawリソースを再生するには、MediaPlayerを次のように初期化する必要があります。

_
MediaPlayer mp = MediaPlayer.create(appContext, R.raw.song);
mp.start();
_

ここまで問題ありません。サウンドが再生され、すべてが正常に動作します。アプリケーションにオプションを追加したいときに問題が発生します。特に「停止」ボタン/オプションを追加した場合。

基本的に、やりたいことは...「Stop」を押すと音楽が止まる。そして、「開始」を押すと、曲/音が最初から始まります。 (かなりベーシック!)

メディアプレーヤーを停止するには、stop()を呼び出すだけです。ただし、サウンドを再度再生するには、メディアプレーヤーをリセットして準備する必要があります。

_
mp.reset();
mp.setDataSource(params);
mp.prepare();
_

問題は、メソッドsetDataSource()が、パラメーターとしてファイルパス、コンテンツプロバイダーURI、ストリーミングメディアURLパス、またはファイル記述子のみを受け入れることです。

したがって、このメソッドはリソース識別子を受け入れないため、prepare()を呼び出すためにデータソースを設定する方法がわかりません。さらに、リソース識別子を使用してデータソースを設定できない理由はわかりませんが、MediaPlayerを初期化するときにリソース識別子を使用できます。

何かが足りないと思います。私は概念を混ぜているのだろうか、メソッドstop()を[Stop]ボタンで呼び出す必要はない。何か助け?

前もって感謝します!!!

24
arakn0

これが、単一のMediaPlayerで複数のリソースをロードするために行ったものです。

/**
 * Play a sample with the Android MediaPLayer.
 *
 * @param resid Resource ID if the sample to play.
 */
private void playSample(int resid)
{
    AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);

    try
    {   
        mediaPlayer.reset();
        mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
        mediaPlayer.prepare();
        mediaPlayer.start();
        afd.close();
    }
    catch (IllegalArgumentException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
    catch (IllegalStateException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
    catch (IOException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }

mediaPlayは、クラス内の他のポイントで作成および解放されるメンバー変数です。これは最善の方法ではないかもしれません(私はAndroid自分自身)に慣れていません)が機能しているようです。mediaPlayerが表示される前に、コードがおそらくメソッドの一番下まで落ちることに注意してください一連のリソースを再生する必要がある場合でも、このケースを処理する必要があります。

27
adstro

これが MediaPlayer.create メソッドが生ファイルを開く方法です:

    public static MediaPlayer create(Context context, int resid) {
         try {
             AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
             if (afd == null) return null;

             MediaPlayer mp = new MediaPlayer();
             mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
             afd.close();
             mp.prepare();
            return mp;
        } catch (IOException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "create failed:", ex);
           // fall through
        } catch (SecurityException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        }
         return null;
    }
15
mishkin

または、次の方法でリソースにアクセスできます。

mediaPlayer.setDataSource(context, Uri.parse("Android.resource://com.package.name/raw/song"));

ここで、com.package.nameはアプリケーションパッケージの名前です。

9

使用できます

mp.pause();
mp.seekTo(0);

音楽プレーヤーを停止します。

4
Rectangle

最後に、それが私のために働く方法:

public class MainStart extends Activity {

    ImageButton buttonImage;
    MediaPlayer mp;
    Boolean playing = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main);

        buttonImage = (ImageButton)findViewById(R.id.ButtonID);


        buttonImage.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                if(playing){
                    mp.stop();
                    playing = false;
                }else{
                    mp = MediaPlayer.create(getApplicationContext(), R.raw.sound_u_want);
                    mp.start();
                    playing = true;
                }
            }
        });
    }
}
3
MarcBilbo

渡したパラメータがnullではないことを再確認してください

考えられる理由

  1. コンテキストがnullの可能性があります
  2. メディアファイルが破損している可能性があります
0
Ranjith Kumar