Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 一次播放一个MediaPlayer实例_Android_Media Player - Fatal编程技术网

Android 一次播放一个MediaPlayer实例

Android 一次播放一个MediaPlayer实例,android,media-player,Android,Media Player,我会保持简单。我正在制作一个基本上可以被认为是音板的东西。除了一个例外,我所有的事情都按照我想要的方式进行。当我选择一个ImageView时,将播放指定给它的声音。当我选择另一个ImageView时,指定给它的声音将播放,但第一个声音仍在播放。它们只是重叠。我希望在新的声音开始时前一个声音停止 我确实看到有人问过类似的问题,但没有一个对我有帮助。有什么简单的东西我可以改变,让它工作吗 这是我的代码(减去导入以节省空间): 公共类铃声扩展了活动实现OnClickListener{ MediaPla

我会保持简单。我正在制作一个基本上可以被认为是音板的东西。除了一个例外,我所有的事情都按照我想要的方式进行。当我选择一个ImageView时,将播放指定给它的声音。当我选择另一个ImageView时,指定给它的声音将播放,但第一个声音仍在播放。它们只是重叠。我希望在新的声音开始时前一个声音停止

我确实看到有人问过类似的问题,但没有一个对我有帮助。有什么简单的东西我可以改变,让它工作吗

这是我的代码(减去导入以节省空间):

公共类铃声扩展了活动实现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; 
}

如果您的声音片段小于1 MB,请尝试使用SoundPool而不是MediaPlayer

SoundPool pool = new SoundPool(maxStreams, streamType, srcQuality);
maxStreams
设置为您希望一次能够播放的声音数(在您的情况下为1)。
streamType
可能是
AudioManager。STREAM\u MUSIC
srcQuality
设置为0(尚未实现)

那你就给我打电话

pool.load(this, R.raw.sound_file, 1);
加载您的声音文件

SoundPool的文档非常好:

您希望前一个声音停止?还是等待?从音板上我希望声音重叠。我希望它完全停止前一个声音。