使用MediaPlayer对象在Android中无法播放许多音频文件。

4
我有一个很长的列表视图。每个列表项都有一个播放按钮(图片)。点击该播放按钮将播放一些小的音频文件。
我创建了一个适配器来加载列表视图中的元素,并在播放时实现了onClick监听器。
当我启动应用程序时,它会正确地加载列表,但音频存在问题。当我播放一些项目(如10-12)多次(如100次),它不会产生任何问题,一切都会顺利运行。 但是,如果我在列表中播放更多的项目,例如30-40个项目。它会停止为后面的项目加载音频文件。对于已经工作的项目,它将继续工作,对于新项目,则无法工作。

enter image description here

    public class WordListAdapter extends BaseAdapter{
    private ArrayList<Word> wordArrayList;
    private Activity activity;
    private static LayoutInflater inflater=null;
    MediaPlayer mp;

    public WordListAdapter(Activity activity, ArrayList<Word> wordArrayList) {
        this.activity = activity;
        this.wordArrayList = wordArrayList;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return wordArrayList.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, final View convertView, final ViewGroup parent) {
        View view = convertView;
        if(convertView == null) {
            view = inflater.inflate(R.layout.item_word, null);
        }

        TextView word1 = (TextView) view.findViewById(R.id.word1);
        TextView word2 = (TextView) view.findViewById(R.id.word2);
        ImageView imageWord = (ImageView) view.findViewById(R.id.imageWord);
        ImageView playWord = (ImageView) view.findViewById(R.id.playWord);

        word1.setText(wordArrayList.get(position).lang1);
        word2.setText(wordArrayList.get(position).lang2);

        if(wordArrayList.get(position).pic == 0) {
            imageWord.setVisibility(GONE);
        }
        else {
            imageWord.setImageResource(wordArrayList.get(position).pic);
        }

        playWord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp = MediaPlayer.create(activity, wordArrayList.get(position).audio);
                mp.start();
            }
        });

        return view;
    }
}

我想问题出在我创建了太多的媒体播放器对象。

如何解决?


你是从手机存储播放音频还是进行流媒体播放? - Mithun Sarker Shuvro
从手机中加载音频文件。MediaPlayer.create(activity, wordArrayList.get(position).audio)我正在从资源中加载音频文件。 - Rahul Kumar
所有音频文件(约100个)都在资源中。 - Rahul Kumar
2个回答

1

我曾经遇到过类似的问题,我的解决方法是使用媒体文件播放服务。我分享一下我所做的事情。创建一个如下的服务:

public class PlayMusicService extends Service
        implements MediaPlayer.OnCompletionListener,  MediaPlayer.OnErrorListener {

    private int audioResource;
    public static MediaPlayer player;


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        audioResource = intent.getIntExtra("musicResource",0);
        player = MediaPlayer.create(this, audioResource);
        player.setLooping(false);
        player.setVolume(100, 100);
        player.setOnCompletionListener(this);
        player.setOnErrorListener(this);
        player.start();
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        player.stop();
        player.release();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        this.onDestroy();
    }

    @Override
    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
        return false;
    }
}

然后像以下这样调用该服务。
        playWord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Intent serviceIntent = new Intent(getActivity(),PlayMusicService.class);
               serviceIntent.putExtra("musicResource", wordArrayList.get(position).audio);
            }
        });

如果这对您有用,请告诉我。这里需要记住的一件事是,您可能需要使用本地广播管理器来从服务中更改视图。


1

MediaPlayer使用系统编解码器,如果您不释放先前创建的MediaPlayer,它们最终会结束。因此,请尝试调用mp.release()。例如,尝试这样做(只是我不确定它是否有效 - 释放自身):

playWord.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mp = MediaPlayer.create(activity, wordArrayList.get(position).audio);
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
               @Override
               public void onCompletion(MediaPlayer mediaPlayer) {
                   mediaPlayer.release();
               }
            });
            mp.start();
       }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接