2017-10-10 8 views
0

누군가 내가이 문제를 어디로 잘못 지적 할 수 있습니까? 이미지 버튼을 누르면 해당 버튼을 누르지 않아도 항상 pinktestaudio가 먼저 재생됩니다. 올바른 사운드를 들으려면 이미지 버튼을 두 번 눌러야합니다. 처음에는 페이지가로드 될 때 발생합니다.MediaPlayer가 처음 클릭 할 때 잘못된 파일을 재생합니다.

import android.content.Context; 
import android.media.MediaPlayer; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ImageButton; 



public class ColorPage extends AppCompatActivity { 

Context context = this; 
//MediaPlayer mpPurple, mpBlue, mpRed, mpGreen, mpYellow, mpPink; 
MediaPlayer media = null; 
//private static MediaPlayer media = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_color_page); 

    ImageButton pinkB = (ImageButton) findViewById(R.id.pinkButton); 
    ImageButton yellowB = (ImageButton) findViewById(R.id.yellowButton); 
    ImageButton purpleB = (ImageButton) findViewById(R.id.purpleButton); 
    ImageButton blueB = (ImageButton) findViewById(R.id.blueButton); 
    ImageButton greenB = (ImageButton) findViewById(R.id.greenButton); 
    ImageButton redB = (ImageButton) findViewById(R.id.redButton); 


    media = MediaPlayer.create(context, R.raw.purpleaudiotest); 
    purpleB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       if (media.isPlaying()) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.purpleaudiotest); 
       } 
       media.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    media = MediaPlayer.create(context, R.raw.blueaudiotest); 
    blueB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       if (media.isPlaying()) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.blueaudiotest); 
       } 
       media.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    media = MediaPlayer.create(context, R.raw.redaudiotest); 
    redB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       if (media.isPlaying()) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.redaudiotest); 
       } 
       media.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    media = MediaPlayer.create(context, R.raw.greenaudiotest); 
    greenB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       if (media.isPlaying()) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.greenaudiotest); 
       } 
       media.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    media = MediaPlayer.create(context, R.raw.yellowaudiotest); 
    yellowB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       if (media.isPlaying()) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.yellowaudiotest); 
       } 
       media.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    media = MediaPlayer.create(context, R.raw.pinkaudiotest); 
    pinkB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      try { 
       if (media.isPlaying()) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.pinkaudiotest); 
       } 
       media.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    }); 
} 
} 

업데이트 : if 문 시작 (모두)을 다음과 같이 변경하면 문제가 해결됩니다.

if (media != null) { 
        media.stop(); 
        media.release(); 
        media = MediaPlayer.create(context, R.raw.pinkaudiotest); 
       } 

답변

0

그것은 항상 pinktestaudio을한다, 그래서 media는 항상 pinktestaudio로 초기화됩니다. 모든 버튼 OnClickListener 당신이 항상

media = MediaPlayer.create(context, R.raw.some_audio_file);

가 실행되지 않습니다 허위 것이다 처음 media.isPlaying()을 위해 어떤 버튼을 클릭에
if(media.isPlaying()) { 
     media.stop(); 
     media.release(); 
     media = MediaPlayer.create(context, R.raw.pinkaudiotest); 
} 

을하기 때문에 심지어 후 다른 버튼을 클릭합니다. 그러나 다시 클릭하면 media.isPlaying()이 사실이며 모두 잘됩니다.

0

onCreate에서 6 개의 MediaPlayer 인스턴스가 만들어집니다. 마지막 하나는 각 청취자에서 사용됩니다.

은 리팩토링 후 코드를 살펴 :

public class ColorPage extends AppCompatActivity implements View.OnClickListener { 

MediaPlayer mMediaPlayer = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_color_page); 

    ImageButton pinkB = (ImageButton) findViewById(R.id.pinkButton); 
    ImageButton yellowB = (ImageButton) findViewById(R.id.yellowButton); 
    ImageButton purpleB = (ImageButton) findViewById(R.id.purpleButton); 
    ImageButton blueB = (ImageButton) findViewById(R.id.blueButton); 
    ImageButton greenB = (ImageButton) findViewById(R.id.greenButton); 
    ImageButton redB = (ImageButton) findViewById(R.id.redButton); 

    pinkB.setOnClickListener(this); 
    yellowB.setOnClickListener(this); 
    purpleB.setOnClickListener(this); 
    blueB.setOnClickListener(this); 
    greenB.setOnClickListener(this); 
    redB.setOnClickListener(this); 
} 

@Override 
public void onClick(View view) { 
    int audio; 

    switch (view.getId()) { 
     case R.id.pinkButton: 
      audio = R.raw.pinkaudiotest; 
      break; 
     case R.id.yellowButton: 
      audio = R.raw.yellowaudiotest; 
      break; 
     case R.id.purpleButton: 
      audio = R.raw.purpleaudiotest; 
      break; 
     case R.id.blueButton: 
      audio = R.raw.blueaudiotest; 
      break; 
     case R.id.greenButton: 
      audio = R.raw.greenaudiotest; 
      break; 
     case R.id.redButton: 
      audio = R.raw.redaudiotest; 
      break; 
     default: 
      audio = R.raw.purpleaudiotest; 
    } 

    try { 
     if (mMediaPlayer != null && mMediaPlayer.isPlaying()) { 
      mMediaPlayer.stop(); 
      mMediaPlayer.release(); 
     } 

     mMediaPlayer = MediaPlayer.create(getApplicationContext(), audio); 
     mMediaPlayer.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

행운을 빕니다! 당신이 마지막에

media = MediaPlayer.create(context, R.raw.pinkaudiotest);

을 수행했기 때문에

0

media 변수를 여러 번 할당하고 마지막으로 pinkaudiotest에 할당하여 문제를 해결하기 때문에 변수에 media 변수를 할당해야합니다. 따라서 버튼을 클릭 할 때만 할당됩니다. `. 여기 당신이 당신의 자신의 동일한 코드를 사용하고 가정하는 것입니다 :

을 당신은 그들이

media = MediaPlayer.create(context, R.raw.purpleaudiotest); 

잘라 그 라인의 형식은 다음과 onClick 안에 붙여 넣기 비슷하게 보이는 SIX 라인을 가지고 메서드를 호출합니다. 나는 너를 위해 첫번째 것을 할 것이고 모두를 위해 그것을 반복 할 것이다 SIX 시간. 모든 SIX하여 ImageButton 및 문제에 대한 사라질 것

purpleB.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // I AM ADDING IT HERE 
    media = MediaPlayer.create(context, R.raw.purpleaudiotest); //ADDED INSIDE oClick(View view) 

     try { 
      if (media.isPlaying()) { 
       media.stop(); 
       media.release(); 
       media = MediaPlayer.create(context, R.raw.purpleaudiotest); 
      } 
      media.start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
}); 

를 반복합니다.