如何在MediaPlayer上播放Android InputStream?

所以我在我的资产文件夹中有一个小的audio文件,我想打开一个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 

  • Android - 从网站下载图片,保存到内部私人应用程序的内存,显示列表项
  • 如何从JsonParser(Jackson Json)获取底层string
  • 在Android中从HttpURLConnection获取InputStream时获取UnknownLengthHttpInputStream
  • 如何在Android内容提供商中存储大blob?
  • Android版本> 2.3上的FileNotFoundException
  • 将InputStream转换为JSONObject
  • 如何获取位图信息,然后从internet-inputStream解码位图?
  • 从外部存储器加载文件到Inputstream
  • 修复。 结果是,在由“File”创build的临时文件中写入缓冲区之后,可以使用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();} } 

    该文件应该在资产文件夹上