Сбой деки Android / MediaPlayer.stop () - PullRequest
0 голосов
/ 02 апреля 2012

У меня проблема с приложением Soundboard для Android.Когда я тестирую его на своем устройстве, приложение вылетает, когда я нажимаю 8-ю кнопку ImageButton:.Кроме того, мне интересно, как я могу остановить медиаплеер, когда я нажимаю другую кнопку.Вот мой код:

package nl.ingmar.soundboard;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

import android.widget.ImageButton;

public class Main extends Activity implements OnClickListener {

ImageButton[] imagebuttons = new ImageButton[20];
MediaPlayer[] geluiden = new MediaPlayer[20];

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    init();
}

private void init() {

    for(int i=0; i<geluiden.length; i++){

        int rawID = getResources().getIdentifier( "geluid" + (i+1) , "raw" , getPackageName() );
        int resID = getResources().getIdentifier("btn" + (i+1), "id", getPackageName());  

        imagebuttons[i] = ((ImageButton) findViewById(resID));  
        imagebuttons[i].setOnClickListener(this); 

        geluiden[i] = MediaPlayer.create(this, rawID);
    }
}

@Override
public void onClick(View v) {
    int index = 0;
    for(int i = 0; i<imagebuttons.length; i++){
        if(imagebuttons[i].getId() == v.getId()){
            index = i;
            geluiden[i].start();
        }
    }
}
}

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

Использование такого большого количества экземпляров MediaPlayer - плохая идея.Я предполагаю, что создание этих множества экземпляров приводит к ошибке. Вы не выпускаете медиаплееры , которые используете для воспроизведения звука, вызывая release(), и у вас скоро не хватает памяти.Вызовите geluiden [i] .release () для каждого экземпляра после завершения.

Я также хотел бы сказать вам, что MediaPlayer не очень хороший вариант , когда вы играете маленькие звуковые эффекты, так как пользователь может очень скоро нажать на несколько кнопок, и у вас будетсоздать объект MP для всех них, что не происходит синхронно.,Выберите класс SoundPool , который позволяет сохранять в памяти загруженные звуки меньшего размера и воспроизводить их в любое время без задержки, которую вы испытываете в медиаплеере.http://developer.android.com/reference/android/media/SoundPool.html Вот хороший учебник: http://www.anddev.org/using_soundpool_instead_of_mediaplayer-t3115.html

0 голосов
/ 02 апреля 2012

Я предлагаю вам не использовать так много экземпляров nediaplayer ... есть вероятность, что вы можете получить ошибку Mediaplayer error (-19,0) из-за недоступности ресурсов ... так что вместо этого используйте один медиаплеер вместо массивамультимедийных проигрывателей .. в onclick создайте мультимедийный проигрыватель и запустите .. проверьте, воспроизводится ли медиаплеер ..

public void onClick(View v) {
 ....

if(geluiden.isplaying()){
 geluiden.stop();
  //create mediaplayer player with new resource and start..
  }
...