【问题标题】:Android Media Player: Start called in state 4 error(-38,0)Android 媒体播放器:在状态 4 错误(-38,0)中调用启动
【发布时间】:2013-03-20 06:07:22
【问题描述】:

这是用于从其他类动态获取文件名(.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()

提前致谢。

【问题讨论】:

    标签: android android-asynctask media-player android-assets


    【解决方案1】:

    您也可以使用下面的onPrepared() 方法调用start 方法,以便在准备好MediaPlayer 之后调用start()

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

    【讨论】:

    • 也许你在准备好之前调用了getCurrentPosition,这个问题的来源是MEDIA_ERROR_IO i thnik
    【解决方案2】:

    除了使用MediaPlayerpreparedSync/prepare 方法,您只需将转换为URI 的文件路径传递给MediaPlayer.create()

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

    这将准备它并开始播放它自己

    或者另一种方法是使用MediaPlayeronPrepareListener(),然后从这个准备开始播放

    【讨论】:

      【解决方案3】:

      状态 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();
      

      你会很高兴的

      【讨论】:

        【解决方案4】:
        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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多