代码之家  ›  专栏  ›  技术社区  ›  chernting

播放SQLite数据库中的音频文件列表

  •  3
  • chernting  · 技术社区  · 8 年前

        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;
    }
    

    1 回复  |  直到 8 年前
        1
  •  0
  •   Yazan    8 年前

    你没有给我添加任何东西 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();
        }
    }
    

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

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