有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在再次播放之前停止MediaPlayer不起作用

我有一个包含一些项目的列表视图,每个项目都会播放特定的声音。以下是代码:

listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
            try {
                player.setDataSource(externalStoragePath + "/Android/data/com.whizzappseasyvoicenotepad/" + recordedFilesArray.get(arg2) + ".mp3");
                player.prepare();
                player.start();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });

如果我单击一个项目,它开始播放,然后在我之前单击的项目结束播放之前单击另一个项目,MediaPlayer将同时播放两种声音。如果我在MediaPlayer停止播放之前单击了该项目,如何让它停止播放前一个声音并开始播放新的声音

我试着添加播放器。在尝试之前停止(),这样每次我单击一个项目时,MediaPlayer都会在设置新源并重新开始之前停止,但这只会停止上一个声音,而不会播放新的声音

我还尝试添加IF语句,如下所示:

if (!player.isPlaying()){
//normally start the player
}
else if (player.isPlaying()){
//stop it before starting it again
}

我会复制我的实际代码,但我已经删除了,因为它不起作用。它也只是停止了前一个声音,没有播放新的声音


共 (4) 个答案

  1. # 1 楼答案

     listView.setOnItemClickListener(new OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
            try {
                stopPlaying();
                initializeMediaPlayer(externalStoragePath + "/Android/data/com.whizzappseasyvoicenotepad/" + recordedFilesArray.get(arg2) + ".mp3");
                startPlaying();
    
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
    
    
    
    private void stopPlaying() {
        if (player!=null && player.isPlaying()) {
            player.stop();
            player.release();
        }
    }
    
    private void initializeMediaPlayer(String path) {
        player = new MediaPlayer();
        try {
            player.setDataSource(path);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private void startPlaying() {
        try {
            player.prepareAsync();
            player.setOnPreparedListener(new OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                if(player!=null)
                player.start();
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
  2. # 2 楼答案

    停止歌曲后重置播放器

      listView.setOnItemClickListener(new OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
            try {
                 if (player!=null && player.isPlaying())
                  {                     
                   player.stop();
                   player.reset();
                  }
    
                player.setDataSource(externalStoragePath +     "/Android/data/com.whizzappseasyvoicenotepad/" + recordedFilesArray.get(arg2) + ".mp3");
                player.prepare();
                player.start();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
    
  3. # 3 楼答案

    必须在空闲状态下调用setDataSource()。所以你必须在调用setDateSource()之前调用reset()

    listView.setOnItemClickListener(new OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
            try {
                player.reset();
                player.setDataSource(externalStoragePath + "/Android/data/com.whizzappseasyvoicenotepad/" + recordedFilesArray.get(arg2) + ".mp3");
                player.prepare();
                player.start();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
    
  4. # 4 楼答案

    要重用MediaPlayer,必须在设置新dataSource之前调用reset()。还有一件事,你不应该在UI线程中调用prepare(),这可能会导致ANR错误。您宁愿调用prepareAsync()函数