如何在MediaPlayer上播放Android InputStream?

| 因此,我的资产文件夹中有一个小型音频文件,我想打开InputStream写入缓冲区,然后写入临时文件,然后打开MediaPlayer播放该临时文件。问题是,当媒体播放器点击mp.Prepare()时,它不会播放并且永远不会到达吐司。有人做过吗?
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    InputStream str;

    try {

        str = this.getAssets().open(\"onestop.mid\");
        Toast.makeText(this, \"Successful Input Stream Opened.\", Toast.LENGTH_SHORT).show();
        takeInputStream(str);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}//end on create

public void takeInputStream(InputStream stream) throws IOException
{
    //fileBeingBuffered = (FileInputStream) stream;
    //Toast.makeText(this, \"sucessful stream conversion.\", Toast.LENGTH_SHORT).show();
    try
    {
        convertedFile = File.createTempFile(\"convertedFile\", \".dat\", getDir(\"filez\", 0));
        Toast.makeText(this, \"Successful file and folder creation.\", Toast.LENGTH_SHORT).show();

        out = new FileOutputStream(convertedFile);
        Toast.makeText(this, \"Success out set as output stream.\", Toast.LENGTH_SHORT).show();

        //RIGHT AROUND HERE -----------

        byte buffer[] = new byte[16384];
        int length = 0;
        while ( (length = stream.read(buffer)) != -1 ) 
        {
          out.write(buffer,0, length);
        }

        //stream.read(buffer);
        Toast.makeText(this, \"Success buffer is filled.\", Toast.LENGTH_SHORT).show();
        out.close();

        playFile();
    }catch(Exception e)
    {
        Log.e(TAG, e.toString());
        e.printStackTrace();
    }//end catch
}//end grabBuffer

public void playFile()
{
    try {
        String path = convertedFile.getAbsolutePath();
        mp = new MediaPlayer();
        mp.setDataSource(path);
        Toast.makeText(this, \"Success, Path has been set\", Toast.LENGTH_SHORT).show();

        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.prepare();
        Toast.makeText(this, \"Media Player prepared\", Toast.LENGTH_SHORT).show();

        mp.start();
        Toast.makeText(this, \"Media Player playing\", Toast.LENGTH_SHORT).show();
    } catch (IllegalArgumentException e) {
        Log.e(TAG, e.toString());
        e.printStackTrace();
    } catch (IllegalStateException e) {
        Log.e(TAG, e.toString());
        e.printStackTrace();
    } catch (IOException e) {
        Log.e(TAG, e.toString());
        e.printStackTrace();
    }

}//end playFile
    
已邀请:
固定它。事实证明,在将缓冲区写入\“ File,\”创建的临时文件中之后,您可以使用FileInputStream打开该文件,然后继续播放如下所示的文件。感谢您的帮助。
mp = new MediaPlayer();

FileInputStream fis = new FileInputStream(convertedFile);
mp.setDataSource(fis.getFD());

Toast.makeText(this, \"Success, Path has been set\", Toast.LENGTH_SHORT).show();

mp.prepare();
mp.start();
    
这是对我有用的代码
//preserved to stop previous actions 
MediaPlayer lastmp;

public void playSound(String file) {
    try {
        if (lastmp!=null) lastmp.stop();
        MediaPlayer mp = new MediaPlayer();
        lastmp = mp;
        AssetFileDescriptor descriptor;

        AssetManager assetManager = act.getAssets();

        descriptor =  assetManager.openFd(fileName);
        mp.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
        descriptor.close();
        mp.prepare();
        mp.start();

    } catch (Exception e) {
        e.printStackTrace();
    }
}
该文件应位于资产文件夹中     

要回复问题请先登录注册