2011-09-25 4 views
1

간단하게 유지하겠습니다. 근본적으로 사운드 보드로 간주 될 수있는 것을 만들고 있습니다. 나는 한 가지 예외를 제외하고는 모든 방식으로 원하는대로 작동합니다. 하나의 ImageView를 선택하면 할당 된 사운드가 재생됩니다. 다른 ImageView를 선택하면 할당 된 사운드가 재생되지만 첫 번째 사운드는 계속 재생됩니다. 그들은 단지 겹쳐집니다. 새 소리가 들리면 이전 소리를 멈추고 싶습니다.한 번에 하나의 MediaPlayer 인스턴스 재생

이와 비슷한 질문이있는 곳을 보았지만 그 중 누구도 저에게 도움이되지 않았습니다. 제대로 작동하도록 간단하게 변경할 수 있습니까? 여기

내 코드 (마이너스 공간을 절약 할 수있는 수입)입니다 :

공용 클래스 벨소리 활동 OnClickListener를 구현 확장 {

MediaPlayer songPlaying; 
MediaPlayer ring1; 
MediaPlayer ring2; 
MediaPlayer ring3; 

String songFile; 
String songTitle; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.ringview); 

    //Rintones Sound 

     ring1 = MediaPlayer.create(ringtones.this, R.raw.cc_sgl_rm); 
     ring2 = MediaPlayer.create(ringtones.this, R.raw.cc_sgl_kft); 
     ring3 = MediaPlayer.create(ringtones.this, R.raw.cc_sgl_e); 

    ImageView iv = (ImageView)findViewById(R.id.ccsgl1); 
    iv.setOnClickListener(this); 
    registerForContextMenu(iv); 

    ImageView iv2 = (ImageView)findViewById(R.id.ccsgl2); 
    iv2.setOnClickListener(this); 
    registerForContextMenu(iv2); 

    ImageView iv3 = (ImageView)findViewById(R.id.ccsgl3); 
    iv3.setOnClickListener(this); 
    registerForContextMenu(iv3); 

} 

@Override 
public void onClick(View v) { 
    switch(v.getId()){ 
     case R.id.ccsgl1: 
      ring1.start(); 
      songFile = "cc_sgl_rm"; 
      songTitle = "Regenerate Me"; 
      songPlaying = ring1; 
      break; 
     case R.id.ccsgl2: 
      ring2.start(); 
      songFile = "cc_sgl_kft"; 
      songTitle = "Knock Four Times"; 
      songPlaying = ring2; 
      break; 
     case R.id.ccsgl3: 
      ring3.start(); 
      songFile = "cc_sgl_e"; 
      songTitle = "Eleven"; 
      songPlaying = ring3; 
      break; 
    } 

} 

public boolean stopsong(MediaPlayer songPlaying){ 
if(songPlaying!=null){ 
    songPlaying.stop(); 
    songPlaying.release(); 
    songPlaying.start(); 
} 
return false; 
} 

//CONTEXT MENU 

@Override 
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) { 
super.onCreateContextMenu(menu, v, menuInfo); 
menu.setHeaderTitle("Save as..."); 
menu.add(0, v.getId(), 0, "Ringtone"); 
} 
@Override 
public boolean onContextItemSelected(MenuItem item) { 
if(item.getTitle()=="Ringtone"){function1(item.getItemId());} 
    else {return false;} 
return true; 
} 



public void function1(int id){ 
if 
(savering(R.raw.cc_sgl_rm)){ 
    // Code if successful 
    Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show(); 
} 
if 
(savering(R.raw.cc_sgl_kft)){ 
    // Code if successful 
    Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show(); 
}  
if 
(savering(R.raw.cc_sgl_e)){ 
    // Code if successful 
    Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show(); 
}  
else   
{ 
    // Code if unsuccessful 
    Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show(); 
} 

} 

//Save into Ring tone Folder 

public boolean savering(int ressound){ 
byte[] buffer=null; 
InputStream fIn = getBaseContext().getResources().openRawResource(ressound); 
int size=0; 

try { 
    size = fIn.available(); 
    buffer = new byte[size]; 
    fIn.read(buffer); 
    fIn.close(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    return false;  } 

String path="/sdcard/media/audio/ringtones/"; 
String filename=songFile+".mp3"; 

boolean exists = (new File(path)).exists(); 
if (!exists){new File(path).mkdirs();} 

FileOutputStream save; 
try { 
    save = new FileOutputStream(path+filename); 
    save.write(buffer); 
    save.flush(); 
    save.close(); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    return false; 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    return false; 
} 
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+path+filename))); 

File k = new File(path, filename); 
ContentValues values = new ContentValues(); 
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
values.put(MediaStore.MediaColumns.TITLE, songTitle); 
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
values.put(MediaStore.Audio.Media.ARTIST, "six3six"); 
values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true); 
values.put(MediaStore.Audio.Media.IS_ALARM, true); 
values.put(MediaStore.Audio.Media.IS_MUSIC, false);  

//Insert it into the database 
this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values); 

return true; 
} 
+0

당신이 막을 수있는 previos 사운드 하시겠습니까? 아니면 기다릴까요? 사운드 보드에서 나는 소리가 겹칠 것을 기대합니다. –

+0

전 소리를 완전히 멈추고 싶습니다. –

답변

0

사운드 클립은 1MB 미만 인 경우, 대신 SoundPool를 사용해보십시오 미디어 플레이어. 소리의 수

SoundPool pool = new SoundPool(maxStreams, streamType, srcQuality); 

설정 maxStreams 당신은 (귀하의 경우 1) 한 번에 연주 할 수 있어야합니다. streamTypeAudioManager.STREAM_MUSIC으로 설정되고 srcQuality은 0으로 설정됩니다 (아직 구현되지 않았습니다).

그럼 당신은 사운드 파일을로드

pool.load(this, R.raw.sound_file, 1); 

를 호출 할 수 있습니다. SoundPool에 대한

워드 프로세서 꽤 좋은 : http://developer.android.com/reference/android/media/SoundPool.html

관련 문제