0

サウンドプールを使用してサウンドを再生するボタンがあります。アプリケーションを開いて、SD カードから .mp3 ファイルを手動でロードし、ボタンで再生したいと考えています。私のJavaコード:

package com.example.idea;

    import android.media.SoundPool;
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.View;

    public class MainActivity extends Activity {
    SoundPool sp;
    int mSoundId;
    int mStreamId;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mSoundId = sp.load(this, R.raw.sound1, 1);

}

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

    public void button1(View view){
    if (mStreamId != 0) {
    sp.stop(mStreamId);
}
    `mStreamId = sp.play(mSoundId, 1, 1, 1, 0, 1f);`
}
}
4

1 に答える 1

1

あなたのSDカードは通常(しかし必然的に)あなたの外部ストレージであるため、そのような解決策を以下に示します. (外部ストレージがデバイス (タブレットなど) の内部カードを指している場合、私のコードはそのフォルダーへのパスを返します。)

したがって、別のバージョンの のロード メソッドを使用する必要があります。このメソッドでは、リソース ID の代わりにSoundPoolファイル パス ( として) が必要です。Stringこれは、メソッドのドキュメントへの公式リンクです。ファイルのパスを取得するには、次のメソッドを使用できます。

private String getFullFilePath(Context context, String filename) {  
    File directory = context.getExternalFilesDir(null);
    File file = new File(directory, filename);
    if (!file.canRead()) {
        // error handling
    }
    return file.getAbsolutePath();  
}

この場合、関連するコード スニペットは次のようになります。

String path = getFullFilePath(getApplicationContext(), "sound1.wav");
mSoundId = sp.load(path, 1);

要約すると、上記のコードは、アプリケーションの外部ストレージ ディレクトリでファイルを検索します。これは、非内部ストレージ ファイルにアクセスする標準的な方法です (つまり、外部ストレージが SD カードであるか他のものであるかによって異なります)。


更新

もちろん、外部ストレージを使用する前に、メディアが読み取り可能かどうか (書き込み要件の場合は書き込み可能かどうか) を確認する必要があります。詳細については、この公式ページを参照してください。

于 2012-11-04T15:24:57.537 に答える