【问题标题】:MediaPlayer is not working with local filesMediaPlayer 无法处理本地文件
【发布时间】:2018-03-03 18:05:32
【问题描述】:

我正在尝试播放来自listview 的音频。我已将所有音频文件提取到listView。在listviewitemClick 事件上将播放歌曲。

当我使用这个时出现问题:

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: 错误 (-38, 0)

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

E/MediaPlayer:错误 (-38,0)

【问题讨论】:

    标签: java android audio android-mediaplayer


    【解决方案1】:

    请修改listview的onclicklistner代码如下:

                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 中将这个listner 代码放在listview 的onclicklistner 之前

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

    【讨论】:

    • 是的,我错过了 oncreate 方法 thnks
    • 您的问题解决了吗?如果是,请使用我的答案,而不是将其标记为已接受,否则请告诉我们问题。
    猜你喜欢
    • 2017-10-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2021-01-12
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多