简体   繁体   English

MediaPlayer无法使用本地文件

[英]MediaPlayer is not working with local files

I am trying to play audio from listview . 我正在尝试从listview播放音频。 I have fetched all the audio files into listView . 我已经将所有音频文件提取到listView On itemClick event of listview the song will be played. listviewitemClick事件中,将播放歌曲。

The problem occurs when I am using this: 当我使用这个时会发生问题:

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

This will work for the first time. 这将是第一次工作。 When I clicked on the second song on the listView the first is continued. 当我单击listView上的第二首歌曲时,第一首继续。

I know that Create() will create another instance of MediaPlayer. 我知道Create()将创建MediaPlayer的另一个实例。 I have declared it as static and it still is creating other instances or I don't know what it is doing. 我已将其声明为静态,并且它仍在创建其他实例,或者我不知道它在做什么。

I have tried with mp.setDataSource(context,myUri); 我已经尝试过mp.setDataSource(context,myUri); but that would causing the error on reset() and stop() . 但这会导致reset()stop()

Here is my code. 这是我的代码。 Can anyone guide me what it is that I'm doing wrong? 谁能指导我我做错了什么?

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


}

The Logcat Showing follwing 显示下面的日志猫

E/MediaPlayer: start called in state 1 E / MediaPlayer:在状态1中开始调用

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

E/MediaPlayer: Should have subtitle controller already set E / MediaPlayer:应该已经设置了字幕控制器

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

Please change listview's onclicklistner code as below: 请按以下方式更改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();
            }

also in oncreate put this listner code before listview's onclicklistner 同样在oncreate中,将此列表代码放在listview的onclicklistner之前

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM