我有使用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);`
}
}
答案 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找到更多相关信息。