gpt4 book ai didi

android - 播放 list 来自 SQLite 数据库的音频文件

转载 作者:太空狗 更新时间:2023-10-29 14:42:22 27 4
gpt4 key购买 nike

我有一个表格,其中包含以 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;
}

这是我的 Activity 类,我想在其中调用我的 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在另一种方法中,您将无法从您的 Activity 中看到该引用。

不是写入文件(在 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();
}
}

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

编辑:要一个一个播放文件,您可能需要制作 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;
}

关于android - 播放 list<byte[]> 来自 SQLite 数据库的音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45913652/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com