如何从SD卡加载和播放声音

时间:2012-11-04 14:46:50

标签: android

我有使用soundpool播放声音的按钮。我想打开我的应用程序,然后从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);`
}
}

1 个答案:

答案 0 :(得分:1)

由于您的SD卡通常(但必然)是您的外部存储,我将在下面提供此类解决方案。 (如果您的外部存储指向设备中的内部卡 - 例如在平板电脑上 - 我的代码将返回该文件夹的路径。)

因此,您应该使用SoundPool的另一个版本的加载方法,该方法需要文件路径(作为String)而不是资源ID。这是方法文档的official link。要获取文件的路径,可以使用以下方法:

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卡或其他内容,则取决于设备)。


更新

当然,在使用外部存储之前,您应该检查媒体是否可读(并且在写入要求时,可写)。您可以在official page找到更多相关信息。