0

我有使用 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);`
}
}
4

1 回答 1

1

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

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

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 回答