2017-08-28 47 views
3

我有一個以BLOB格式保存音頻數據的表格。我想播放音頻文件,但在從數據庫調用方法時遇到問題。播放列表<byte[]>來自SQLite數據庫的音頻文件

這是我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()方法?謝謝。

+1

**可怕的**練習,用BLOBs膨脹一個數據庫! –

+1

爲什麼?爲什麼'File.createTempFile'並將它寫入BLOB內容,同時可以將它保存在某個文件中,並將路徑保存在數據庫中?同意ModularSynth 100%... – pskink

+0

@ModularSynth對不起。即時通訊新的android。任何建議我應該怎麼做? – chernting

回答

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

NOW:因爲你主要是利用文件(播放的媒體)的d,通過上述評論的建議,你可以而不是存儲的音頻文件的字節存儲文件名和路徑(如字符串) 你就可以立刻從DB retrive文件名和啓動媒體播放器

編輯:播放文件一個接一個,你可能想使List<byte[]> audio類範圍,並調用playMp3(audio.get(index));其中index是您提高每一次你玩一個文件時,一個整數(但要小心,不要檢查

類範圍:

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

然後onClick的播放按鈕:

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

我現在可以播放音頻,但它會創建多種聲音,如果要一個接一個地播放音頻,我該怎麼做?我是否需要使用其他方法而不是循環? – chernting

+0

@chernting是的,檢查我的答案(編輯) – Yazan