MediaPlayer不使用本地文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MediaPlayer不使用本地文件相关的知识,希望对你有一定的参考价值。

我正在尝试播放来自listview的音频。我已将所有音频文件提取到listView中。在itemClicklistview事件中,将播放这首歌。

我使用这个时出现问题:

MediaPlayer mp= new MediaPlayer.create(this,myFile);
mp.start();

这将是第一次工作。当我点击listView上的第二首歌时,第一首歌继续播放。

我知道Create()将创建另一个MediaPlayer实例。我已经声明它是静态的,它仍然在创建其他实例,或者我不知道它在做什么。

我曾尝试使用mp.setDataSource(context,myUri);,但这会导致reset()stop()的错误。

这是我的代码。任何人都可以指导我做错了什么吗?

public static class FirstFragment extends Fragment {

    View myView;
    private String[] theNamesOfFiles;
    Intent i = new Intent();
    public static MediaPlayer mp = new MediaPlayer();


    @Nullable
    @Override
    public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

        myView = inflater.inflate(R.layout.first_layout, container, false);

        final File dir = new File(Environment.getExternalStorageDirectory() + File.separator + "Ringtones");
        File[] filelist = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return !pathname.isHidden();
            }
        });
        theNamesOfFiles = new String[filelist.length];
        for (int i = 0; i < theNamesOfFiles.length; i++) {
            theNamesOfFiles[i] = filelist[i].getName();

        }

        ListView listview = (ListView) myView.findViewById(R.id.RecordingList);
        ArrayAdapter<String> listviewAdapter = new ArrayAdapter<String>(
                getActivity(), android.R.layout.simple_list_item_1, theNamesOfFiles
        );
        listview.setAdapter(listviewAdapter);
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Uri myUri=  Uri.parse(dir+"/"+theNamesOfFiles[position]);
                mp.create(getActivity().getBaseContext(),myUri);
                if(mp.isPlaying())
                {
                    mp.stop();
                    mp.reset();
                    mp.release();
                }
                mp.start();
            }

        });

        return myView;
    }


}

Logcat显示如下

E / MediaPlayer:在状态1中调用

E / MediaPlayer:eroor(-38,0)

E / MediaPlayer:应该已经设置了字幕控制器

E / MediaPlayer:错误(-38.0)

答案

请更改listview onclicklistener代码,如下所示:

            Uri myUri = Uri.parse(dir + "/" + theNamesOfFiles[position]);
            try {
                mp.stop();
                mp.reset();
                mp.setDataSource(MainActivity.this, myUri);
                mp.prepareAsync();
            } catch (Exception ex) {
                ex.printStackTrace();
            }

同样在oncreate中将这个监听器代码放在listview onclicklistener之前

    mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            if (mp.isPlaying())
                mp.stop();
            else
                mp.start();
        }
    });

以上是关于MediaPlayer不使用本地文件的主要内容,如果未能解决你的问题,请参考以下文章

Mediaplayer在切换片段时没有暂停

如何在所有活动和片段中使用 MediaPlayer 的单个实例?

Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段

使用MediaPlayer播放音频文件

MediaPlayer 播放本地视频源码流程-setDataSource

Android MediaPlayer AudioStream AudioFlinger 服务器死机!,致命信号 11