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

Если ваши звуковые клипы менее 1 МБ, попробуйте использовать Soundpool вместо Медиа плеер.

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

Набор maxStreams количеству звуков вы хотите, чтобы иметь возможность играть сразу (1 в вашем случае). streamType, вероятно, будет AudioManager.STREAM_MUSIC установить srcQuality в 0 (он еще не реализован).

Тогда вы будете называть

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

, чтобы загрузить звуковой файл.

Документов для Soundpool довольно хорошо: http://developer.android.com/reference/android/media/SoundPool.html

Смежные вопросы