我有一个表格,其中包含以BLOB格式保存的音频数据。我想播放音频文件但是从数据库调用方法时遇到问题。
这是我的DatabaseAccess.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(文件))。
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()方法?感谢。
答案 0 :(得分:0)
你没有向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
引用this answer它只是一个概念,您可能需要稍微更改一下,或使用最新代码来使用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();
}
}
现在:由于您主要使用文件(播放媒体)并按照上述评论的建议,您可以代替存储音频文件的字节,存储文件名和路径(如串) 然后,您可以立即从DB中检索文件名并启动媒体播放器
编辑:要逐个播放文件,您可能需要制作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;
}