【问题标题】:Not able to play many audio files in Android using MediaPlayer objects无法使用 MediaPlayer 对象在 Android 中播放许多音频文件
【发布时间】:2017-06-07 06:37:09
【问题描述】:

我有一个很大的列表视图。每个列表视图项都有一个播放按钮(图像)。单击该播放按钮时,它将播放一些小音频文件。

我创建了一个适配器来加载列表视图中的元素,并在播放时实现了 onClick 监听器。

当我启动应用程序时,它正在正确加载列表,但音频出现了一些问题。当我多次(比如 100 次)玩几个(比如 10-12)个项目时,它不会产生任何问题,一切都会顺利进行。

但如果我在列表中播放更多项目,例如 30-40 个项目。它停止为以后的项目加载音频文件。对于项目,它正在工作,它将继续工作,对于新项目,它不起作用。

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

我猜这个问题是因为我创建了太多的媒体播放器对象。

如何解决?

【问题讨论】:

  • 您是在播放手机存储中的音频还是流媒体?
  • 来自电话。 MediaPlayer.create(activity, wordArrayList.get(position).audio)我正在从资源中加载音频文件。
  • 所有音频文件(大约 100 个)都在资源中。

标签: android audio android-mediaplayer


【解决方案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);
            }
        });

让我知道它是否适合你。这里要记住的一件事是,您可能需要使用本地广播管理器来更改服务的视图。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多