2017-01-20 14 views
0

У меня проблема с воспроизведением mp3 из папки с данными. Когда я пытаюсь изменить изображение на кнопку, mp3 перестает играть (не всегда ...) Ошибка, что им получатьAndroid MediaPlayer останавливает создание объектов palyng после изменения изображения на кнопке из активов

Вт/MediaPlayer-JNI: MediaPlayer завершена без освобождения

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    if(enableMusic){ 
     playMusic(); 
    } 
... 


private void playMusic() { 
    boolean noAudioFile = false; 
    Context context = this; // or ActivityNotification.this 
    MediaPlayer mpMusic = new MediaPlayer(); 
    AssetManager mg2 = getResources().getAssets(); 
    String musicPath = langFolder+audioFolder+"system/Bubble_Bath.mp3"; 
    try { 
     mg2.open(musicPath); 

    } catch (IOException ex) { 
     noAudioFile = true; 
    } 

    if(!noAudioFile) { 
     AssetFileDescriptor descriptor = null; 
     try { 
      descriptor = context.getAssets().openFd(musicPath); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     long start = descriptor.getStartOffset(); 
     long end = descriptor.getLength(); 
     try { 
      mpMusic.setDataSource(descriptor.getFileDescriptor(), start, end); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    else{ 

    } 
    mpMusic.setVolume(5,5); 
    try { 
     mpMusic.prepare(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    mpMusic.start(); 
    mpMusic.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      mp.start(); 
     } 
    }); 


} 


public void nextCard(View view) throws IOException { 
    i++; 
    if (i==files.length) i=0; 
    if(i>-1){ 
     Button btnNext = (Button)findViewById(R.id.btnNext); 
     btnNext.setText("Next"); 
    } 
    Drawable d = Drawable.createFromStream(getAssets().open(categoryPath+"/"+files[i]+".png"), null); 
    findViewById(R.id.btnImage).setBackgroundDrawable(d); 
    if(files[i].substring(0,1).contains("a") || files[i].substring(0,1).contains("i")){ 
     startFileSound = langFolder + audioFolder + "system/GAME_thisisan.mp3"; 
    } 
    else if (files[i].substring(files[i].length()-1,files[i].length()).contains("s")){ 
     startFileSound = langFolder + audioFolder + "system/GAME_theseare.mp3"; 
    } 
    else{ 
     startFileSound = noAudioFileSound; 
    } 
} 

Когда я попытаюсь прокомментировать строку ниже, mp3 играет без проблем.

Drawable г = Drawable.createFromStream (. GetAssets() открытые (categoryPath + "/" + файлы [I] + "PNG."), NULL);

ответ

0

загружаемой Drawable из папки активов, что является правильным. Но не делайте в основной теме. Попробуйте сделать это в разных потоках.

+0

Запуск музыки в другом потоке помогло :) Спасибо за совет 'Тема = новый поток() { @Override общественности недействительным запуска() { ИНТ р = 0; while (p! = 1) { mpMusic.start(); } } }; thread.start(); ' –

0

Никогда не создавать MediaPlayer как этот MediaPlayer mpMusic = new MediaPlayer();

Использование

 MediaPlayer.create(context,R.raw.music); 
+0

Я хочу использовать папку активов. Это единственный способ, который я могу найти для работы с папкой с ресурсами –

+0

@RobertRupa, вы пытались загрузить «Bitmap» в другой поток? Может быть, «AsyncTask»? – Ekalips

+0

Мне нужно узнать это сначала :). Я попробую. –

0

пытаются закрыть дескриптор

mpMusic.setDataSource(descriptor.getFileDescriptor(), start, end); 
descriptor.close(); 
+0

После завершения дескриптора проблема все еще существует. –