2012-07-24 293 views
1

我产生一个MIDI文件,并把它写这样的:的Android的MediaPlayer - 切换到下一首歌曲

File output = new File("exampleout.mid"); 

我想我可能需要改变这一点,所以它是在正确的文件夹(只是一个可读/写文件夹,也许音乐/)

接下来我想用MediaPlayer播放这个MIDI文件,但我无法弄清楚如何加载文件。

mediaPlayer = MediaPlayer.create(this, R.raw.test3); 

只从只读目录/ res/raw加载。但如果我尝试这样的:

mediaPlayer = MediaPlayer.create(this, "file://exampleout"); 

它不起作用,因为创建需要一个整数作为输入。我试用了AssetFileDescriptor,但还没有弄明白。

同时,我想生成一个新的midi文件并将其加载到mediaPlayer(链接)中,以便在第一个文件播放完毕时播放。

MediaPlayer mediaPlayer = MediaPlayer.create(Activity.this,R.raw.a1); 
mediaPlayer.setOnCompletionListener(new musicCompletionListener()); 
mediaPlayer.start(); 
private class musicCompletionListener implements OnCompletionListener { 
    @Override 
    public void onCompletion(MediaPlayer mediaPlayer) { 
mediaPlayer.setDataSource(WHATTOPUTHERE) 
     mediaPlayer.release(); 
    } 
} 

我的问题真的是如何调用该文件。我不能使用字符串,r.raw目录是不可能的,因为它的只读性质。我觉得这个解决方案并不难,但我只是从C++中简化了java,任何帮助都非常感谢!

+0

只是一句话。我尝试setDataSource(字符串),但这给了我和IOerror,如http://stackoverflow.com/questions/9625680/mediaplayer-setdatasource-better-to-use-path-or-filedescriptor中所述所以我想我需要一个方式就像,AssetManager assetManager = Context.getAssets(); AssetFileDescriptor fileDescriptor = assetManager.openFd(“a2.mp3”); mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor()); – dorien 2012-07-24 13:26:43

+1

您必须在setDataSource中传递Uri,您可以按照以下方式获取它。 String path =“你存储动态生成的midi文件的路径”; Uri midiUri = Uri.parse(path); 希望这会解决你的问题。 – 2012-07-25 06:22:53

+0

@Android_Crazy谢谢。我尝试过这个。它给了我'Uri无法在'setDataSource(Uri)'上解析成变量''。我这样做:'String path =“/data/data/com.example.optimuse/exampleout.mid”; \t \t Uri midiUri = Uri.parse(path); \t \t \t \t // String filePath = topDirFile.getAbsolutePath()+ File.separator +“exampleout.mid”; \t尝试{ \t \t \t mediaPlayer.setDataSource(Uri); \t \t //mediaPlayer.setDataSource("/res/raw/test3“); \t \t} catch(Exception e1){ \t \t \t e1.printStackTrace(); \t} – dorien 2012-07-25 09:55:34

回答

1

我将该文件存储在缓存目录中,该工作!

File output = new File(getCacheDir() + "/exampleout.mid"); 

,然后调用该文件:

String filePath = null; 
    File file = null; 
    FileInputStream inputStream = null; 
try { 
      filePath = getCacheDir() + "/exampleout.mid"; 
      file = new File(filePath); 

      inputStream = new FileInputStream(file); 
      if(inputStream.getFD().valid()) 
      { 
       System.out.println("Valid!"); 
      } 
     } catch (Exception e1) { 
      e1.printStackTrace(); 
      System.exit(-1); 
     } 

     try { 
     mediaPlayer = new MediaPlayer(); 
     mediaPlayer.setDataSource(inputStream.getFD()); 
     inputStream.close(); 
    } catch (Exception e1) { 
     e1.printStackTrace(); 
     System.exit(-1); 
    } 

    try { 
     mediaPlayer.prepare(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

很高兴看到解决方案。 – 2012-07-25 12:45:27

0

你必须很好地设计你的应用程序的体系结构,然后只有你可以实现你所要求的。

根据我的说法,你可以做到以下几点。

  1. 设计,其中包含媒体播放器
  2. 方法midiReady(MIDI文件的URI)
  3. 此接口由您的活动实现的接口,只要MIDI文件的生成完成调用该方法midiReady(URI的MIDI文件)
  4. 现在,因为你的活动实现了界面回调在你的活动中被调用,你可以设置mediaplayer播放midi文件,因为在回调中你有你的MIDI文件的URI。

上述metinoed点只是一个微弱的想法,你可以做。有了上述微弱的想法,你可以前进实施。

希望这会有所帮助。 谢谢。

+0

谢谢,但是midi文件在需要播放之前就已经准备好了。这就是为什么我想使用onCompletion()。我只是不知道播放第二个文件的方式,我无法找到MediaPlayer的良好文档。 – dorien 2012-07-24 12:23:29

+0

您可以在完成调用后立即实施一个midi文件队列,您可以从队列中取出midi文件并播放它。 – 2012-07-24 12:55:11

+0

是的,我认为那会奏效。我实际上停留在更基本的层面,即如何调用文件(请参阅问题)。任何帮助深表感谢! – dorien 2012-07-24 13:15:08

相关问题