E / MediaPlayer:错误(1,-19),E / MediaPlayer:错误(0,-38)

时间:2018-01-18 16:27:10

标签: android audio android-mediaplayer

我的问题是,在处理媒体播放器时,我不断遇到的问题不仅包括音频文件,还包括视频文件。当“播放按钮”被按下大约10次而不重新启动应用程序时,应用程序将停止并且LogCat将显示错误消息“E / MediaPlayer:error(1,-19)”。

我搜索过Stack以及媒体播放器上的Android开发者页面,但无法弄清楚如何解决这个问题。下面的代码似乎让我大约16次按下播放按钮,但没有更多。这比我尝试过的其他方法要多得多。

这个特殊的代码播放了短暂的动物声音让我的侄子认出来。我觉得我错过了媒体播放器的一些东西,但不能把手指放在它上面。

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/gradient"
    tools:context="com.curiousca.griddemo.MainActivity"> 
     <GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">

        <Button
            android:id="@+id/bluejay"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/button_draw"
            android:layout_margin="5dp"
            android:layout_column="0"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_row="0"
            android:layout_rowWeight="1"
            android:onClick="onClick"
            android:text="Bluejay" />
    </GridLayout>
 `

       public void onClick(View view) {

         int id = view.getId();
         String songId = "";

         songId = view.getResources().getResourceEntryName(id);

         int resourceId = getResources().getIdentifier(songId, "raw", getPackageName());

         MediaPlayer mediaPlayer = MediaPlayer.create(this, resourceId);
           if (mediaPlayer != null){
           mediaPlayer.start();
           }


         //Log.i("Click", String.valueOf(view.getId()));
         Log.i("tap", songId);
       }

1 个答案:

答案 0 :(得分:1)

swooby

  1. 实例化媒体播放器

    private static MediaPlayer mediaPlayer;
    public static MediaPlayer getMediaPlayer() {
    return mediaPlayer;
    
  2. 最好将代码放在try / catch块中,以处理发生的任何异常

    try {
    if (btn == firstBird){
      stopPlaying();
      mediaPlayer = MediaPlayer.create(getActivity()
                .getApplicationContext(),R.raw.bird_one);
      mediaPlayer.start();
      mediaPlayer.setLooping(true);
      timerTextView.setText("15:00");
    catch (IllegalStateException e){
        stopPlaying();
    }
    
  3. 创建其他方法以防止重写代码

  4. “ stopPlaying()”方法有助于停止和释放媒体播放器。 应该调用此方法,以确保媒体播放器以前没有参与或从其他活动,片段或当前活动/片段中播放。

    public void stopPlaying() {
      if (mediaPlayer != null){
        mediaPlayer.stop();
        mediaPlayer.release();
        mediaPlayer = null;
    
  5. 在开始新的mediaPlayer实例之前,请调用stopPlaying()方法。参见#2。
  6. 如果您要在倒数计时器内循环播放声音,请务必使用类似这样的方法...

    @Override
    public void onFinish() {
       resetTimer();
       stopPlaying();
     }
    
  7. 在“停止按钮”代码中最后包含onCompletion()方法

    if (btn == stopPlay){
            onCompletion(mediaPlayer);
        }
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
        mediaPlayer.stop();
        mediaPlayer.release();
    }
    

    通过这种方式,媒体播放器将停止并释放以进行下一个操作。