web-dev-qa-db-ja.com

Android Media Player:状態4で呼び出された開始エラー(-38,0)

これは、他のクラスからファイル名(.mp3)を動的にフェッチするために使用しているコードです。私のアセットフォルダに多数のmp3ファイルがあるためです。

playAudioButton.setOnClickListener(new OnClickListener() {


            @Override
            public void onClick(View v) 
            {
                FileName audio=new FileName();
                String audioName=audio.getAudioName(count).toString();
                if(audioName=="NO Audio")
                {

                    Toast.makeText(getApplicationContext(), "No Audio for this page", Toast.LENGTH_SHORT).show();

                }
                else
                {

                    try {
                        afd=getAssets().openFd(audioName + ".mp3");
                        mp = new MediaPlayer();
                        mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                        mp.prepareAsync();
                        mp.start();

                    } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalStateException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }




            }
        });


    }

ログ猫:

03-20 11:21:28.726: E/SpannableStringBuilder(4418): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-20 11:21:28.726: E/SpannableStringBuilder(4418): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-20 11:22:24.968: D/libEGL(4579): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
03-20 11:22:24.976: D/libEGL(4579): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
03-20 11:22:24.984: D/libEGL(4579): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
03-20 11:22:25.070: D/OpenGLRenderer(4579): Enabling debug mode 0
03-20 11:22:38.773: E/MediaPlayer(4579): start called in state 4
03-20 11:22:38.773: E/MediaPlayer(4579): error (-38, 0)
03-20 11:22:38.773: E/MediaPlayer(4579): Error (-38,0)

注意点:1.スタックオーバーフローで同様のスレッドを確認しましたが、答えはprepareAsync()を使用しています2. prepareAsync()を使用しました

前もって感謝します。

22
D'yer Mak'er

以下のonPrepared()メソッドを使用してstartメソッドを呼び出し、MediaPlayerが準備された後にstart()が呼び出されるようにすることもできます。

mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            // TODO Auto-generated method stub

            mp.start();

        }
    });
21
nidhi_adiga

MediaPlayerのこの_preparedSync/prepare_メソッドを使用する代わりに、ファイルパスをURIに変換してMediaPlayer.create()に渡すだけです。

_MediaPlayer mediaPlayer = MediaPlayer.create(context, URI.parse("file://"+filePath));
_

これはそれを準備し、それ自体を再生し始めます

または別の方法は、MediaPlayeronPrepareListener()を使用し、これから準備された再生を開始することです

2
Pratik

状態4は、Mediaplayerが準備状態であることを意味します

そして私たちは他のアクションを

_Mediaplayer.start() 
Mediaplayer.stop() 
Mediaplayer.pause() 
_

または他のもの。

あなたのコードによると、それはMediaplayer.start();です

あなたはonprepareメソッドを書く必要があります

_MediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            // TODO Auto-generated method stub
            mp.start();
        }
    });
_

Onprepared()メソッドが呼び出されると、さらに処理を行うことができます

削除するだけ

_mp.start() 
_

_mp.prepareAsync();
_

そして、あなたは行ってもいいでしょう

1
user6090074
public class BackgroundSound extends AsyncTask<String, Void, Void> {
    MediaPlayer mediaPlayerChatAudio;

    @Override
    protected Void doInBackground(String... params) {
        String model = params[0];
        final Uri uri = Uri.parse(model);
        LogEm.e("EM", "::::::::::URI::::::::::" + model);

        if (uri == null || uri == Uri.EMPTY) return null;
        if (mediaPlayerChatAudio != null) mediaPlayerChatAudio.stop();

        try {
            mediaPlayerChatAudio = MediaPlayer.create(TextActivity.this, uri);
            mediaPlayerChatAudio.setAudioStreamType(AudioManager.STREAM_MUSIC);
        } catch (Exception e) {
            // do nothing.
        }
        if (mediaPlayerChatAudio == null) return null;

        mediaPlayerChatAudio.setVolume(1.0f, 1.0f);
        mediaPlayerChatAudio.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mediaPlayerChatAudio.reset();
                mediaPlayerChatAudio.release();
                mediaPlayerChatAudio = null;
            }
        });
        mediaPlayerChatAudio.start();
        return null;
    }
}
0
azad singh