2012-07-24 3 views
1

로 전환 나는 미디 파일을 생성하고이처럼 쓰기 : 나는이를 변경해야 할 수도 있습니다 생각안드로이드 MediaPlayer를 - 다음 곡

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

를, 그래서 올바른 폴더 (단지 읽기/쓰기에 폴더, 아마 Music /)

다음이 Media Player로이 미디 파일을 재생하려고하지만이 파일을로드하는 방법을 알 수 없습니다.

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

읽기 전용 디렉토리/res/raw에서만로드됩니다. 하지만 같은 것을 시도해 보면 :

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

생성에는 정수로 입력해야하기 때문에 작동하지 않습니다. AssetFileDescriptor를 실험했지만 아직 설명하지 못했습니다.

한편 새 파일을 생성하고 첫 번째 파일 재생이 끝나면 재생할 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(); 
    } 
} 

내 문제는 실제로 파일을 호출하는 방법입니다. 내가 문자열을 apparantly 사용할 수 없습니다 r.raw 디렉토리는 읽기 전용 성 때문에 불가능합니다. 솔루션이 그렇게 어렵지는 않다고 생각하지만, C++에서 Java로 편 해지고 있습니다. 어떤 도움도 많이 받으 셨습니다!

+0

그냥 말 :

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

그리고 다음 파일을 호출. 나는 setDataSource (string)을 시도했으나 http://stackoverflow.com/questions/9625680/mediaplayer-setdatasource-better-to-use-path-or-filedescriptor에 설명 된 것과 같이 이것은 나와 IOerror를 준다. 방법, AssetManager assetManager = Context.getAssets(); AssetFileDescriptor fileDescriptor = assetManager.openFd ("a2.mp3"); mediaPlayer.setDataSource (fileDescriptor.getFileDescriptor()); – dorien

+1

다음과 같이 얻을 수있는 setDataSource에서 Uri를 전달해야합니다. String path = "동적으로 생성 된 MIDI 파일을 저장하는 경로"; Uri midiUri = Uri.parse (path); 호프가 문제를 해결할 수 있기를 바랍니다. –

+0

@Android_Crazy 감사합니다. 나는 그것을 시도했다. 그것은'setDataSource (Uri)'에서'Uri는 변수로 해석 될 수 없습니다 '라고 말해줍니다. 나는 이것을 다음과 같이했다 :'String path = "/data/data/com.example.optimuse/exampleout.mid"; \t \t Uri midiUri = Uri.parse (path); \t \t \t \t // 파일 filePath = topDirFile.getAbsolutePath() + File.separator + "exampleout.mid"; \t 시도 { \t \t \t mediaPlayer.setDataSource (Uri); \t \t //mediaPlayer.setDataSource("res/raw/test3 "); \t \t} 캐치 (예외 E1) { \t \t \t e1.printStackTrace(); \t \t}' – dorien

답변

1

나는 캐시 dir에 파일을 저장했다.

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

솔루션을보고 반갑습니다. –

0

귀하의 응용 프로그램 아키텍처를 멋지게 디자인해야만 당신이 요구 한 것을 얻을 수 있습니다.

제게 따르면 다음을 수행 할 수 있습니다.

  1. 디자인 즉시 미디 파일로 MediaPlayer를에게
  2. 이 포함이 인터페이스는 사용자의 활동에 의해 구현되는
  3. 방법 midiReady (미디 파일의 URI)과의 인터페이스가 완료된 세대는 방법 midiReady을 (전화 URI입니다)
  4. 이제 액티비티에서 인터페이스 콜백이 구현되었으므로 콜백에서 미디 파일의 URI가 있기 때문에 미디어 플레이어가 미디 파일을 재생하도록 설정할 수 있습니다.

위의 metinoed 포인트는 수행 할 수있는 희미한 아이디어입니다. 희미한 아이디어 위에는 구현을 위해 앞으로 나아갈 수 있습니다.

희망이 도움이 될 것입니다. 감사합니다. .

+0

감사합니다. 그러나 미디 파일은 재생해야하기 훨씬 전에 준비됩니다. 그래서 onCompletion()을 사용하는 것에 대해 생각한 것입니다. 두 번째 파일을 재생하는 방법을 모르지만 MediaPlayer에 대한 좋은 설명서를 찾을 수 없습니다. – dorien

+0

oncompletion이 호출되면 바로 대기열에서 미디 파일을 가져 와서 재생할 수 있도록 대기열 파일을 구현할 수 있습니다. –

+0

네, 그렇게 될 것이라고 생각합니다. 나는 실제로 파일을 호출하는 (질문 참조)보다 기본적인 수준에 머물러있다. 어떤 도움을 많이 주시면 감사하겠습니다! – dorien

관련 문제