播放列表<字节[]>来自SQLite数据库的音频文件



我有一个以BLOB格式保存的音频数据的表格。我想播放音频文件,但在从数据库中调用该方法时遇到问题。

这是我的数据库访问.java

public List<byte[]> getAudio(long i) {
List<byte[]> list = new ArrayList<>();
File file;
FileOutputStream fos;
byte[] byteaudio = null;
String selectAudio = "SELECT VocabAudio FROM Vocab WHERE VocabTopic =" + i;
Cursor c = database.rawQuery(selectAudio, null);
if(c.moveToFirst())
do{
byteaudio = c.getBlob(c.getColumnIndex("VocabAudio"));
try{
file = File.createTempFile("audio", "audio");
fos = new FileOutputStream(file);
fos.write(byteaudio);
fos.close();
}catch (IOException e){
e.printStackTrace();
}
}while(c.moveToNext());
return list;
}

这是我的活动类,我想在其中调用我的 getAudio() 方法。它说它找不到符号变量文件(从 Uri.fromFile(file))。

public void startSlides() {
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
runOnUiThread(new Runnable() {
public void run() {
Intent intent = getIntent();
long topicId = intent.getLongExtra("SelectedTopicId", 0);
databaseAccess.open();
List<byte[]> audio = databaseAccess.getAudio(topicId);
mp= MediaPlayer.create(Choice.this,Uri.fromFile(file));
i++;
mp.start();

databaseAccess.close();
if (j == vocab.size()+1) {
timer.cancel();
}
}
});
}
}, 0, 1000;
}

有人知道我应该如何调用getAudio()方法吗?谢谢。

您没有向list添加任何内容,则仅将字节写入文件,另一件事是file在另一种方法中,您将无法从您的活动中看到该引用。

而不是写入文件(在getAutdio中),将字节添加到列表中并返回它。

现在,您可以从列表中播放音频或写入文件,然后播放音频。

您的代码可能如下所示:

public List<byte[]> getAudio(long i) {
List<byte[]> list = new ArrayList<>();
byte[] byteaudio = null;
String selectAudio = "SELECT VocabAudio FROM Vocab WHERE VocabTopic =" + i;
Cursor c = database.rawQuery(selectAudio, null);
if(c.moveToFirst())
do{
byteaudio = c.getBlob(c.getColumnIndex("VocabAudio"));
list.add(byteaudio);
}while(c.moveToNext());
return list;
}

对于播放,您可以将byte[]写入文件中创建MediaPlayer参考这个答案只是一个概念,你可能需要稍微改变一下,或者使用最新的代码来使用MediaPlayer

public void run() {
Intent intent = getIntent();
long topicId = intent.getLongExtra("SelectedTopicId", 0);
databaseAccess.open();
List<byte[]> audio = databaseAccess.getAudio(topicId);
databaseAccess.close();
for(byte[] track : audio){
playMp3(track);
}//for loop
if (j == vocab.size()+1) {
timer.cancel();
}
}

NOW:由于您主要使用文件(播放媒体)并且如上面的评论所建议的那样,您可以存储文件名和路径(作为字符串)而不是存储音频文件的字节 然后,您可以立即从数据库中检索文件名并启动媒体播放器

编辑:要逐个播放文件,您可能需要List<byte[]> audio类范围,并调用playMp3(audio.get(index));其中index是每次播放文件时增加的整数(但请注意不要检查

类范围:

private List<byte[]> audio;
private int index =0;

然后点击播放按钮:

@Override
public void onClick(View view){
if(index >= audio.size()){
index = 0; // back to first track ?
}
playMp3(audio.get(index));
++index;
}

最新更新