1

MIDIファイルを生成し、次のように記述します。

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

これを変更する必要があるかもしれないと思うので、正しいフォルダにあります(読み取り/書き込み可能なフォルダ、おそらくMusic /)

次に、このMIDIファイルをMediaPlayerで再生したいのですが、ファイルの読み込み方法がわかりません。

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

読み取り専用ディレクトリ/res/rawからのみロードされます。しかし、私が次のようなことを試してみると:

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

createは入力として整数を必要とするため、機能しません。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に移行しているだけです。助けていただければ幸いです!

4

2 に答える 2

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();
    }
于 2012-07-25T12:03:21.220 に答える
0

あなたはあなたのアプリのアーキテクチャをうまく設計しなければなりません、そうすればあなただけがあなたが求めたことを達成することができます。

私によると、あなたは次のことができます。

  1. メソッドmidiReady(midiファイルのURI)を使用してインターフェイスを設計します
  2. このインターフェースは、メディアプレーヤーを含むアクティビティによって実装されます
  3. MIDIファイルの生成が完了するとすぐに、メソッドmidiReady(MIDIファイルのURI)を呼び出します。
  4. これで、アクティビティが実装されるため、インターフェイスコールバックがアクティビティで呼び出され、コールバックにMIDIファイルのURIがあるため、MIDIファイルを再生するようにメディアプレーヤーを設定できます。

上記のメチノのポイントは、あなたが何ができるかについてのほんのわずかな考えです。上記のかすかな考えで、あなたは実装に進むことができます。

これがお役に立てば幸いです。ありがとう。

于 2012-07-24T10:33:22.273 に答える