MediaPlayer 无法处理本地文件
MediaPlayer is not working with local files
我正在尝试播放来自 listview
的音频。我已将所有音频文件提取到 listView
。在 listview
的 itemClick
事件中将播放歌曲。
我在使用这个的时候出现的问题:
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: start called in state 1
E/MediaPlayer: error (-38, 0)
E/MediaPlayer: Should have subtitle controller already set
E/MediaPlayer: Error (-38,0)
请修改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 中将此监听器代码放在列表视图的 onclicklistner 之前
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
if (mp.isPlaying())
mp.stop();
else
mp.start();
}
});
我正在尝试播放来自 listview
的音频。我已将所有音频文件提取到 listView
。在 listview
的 itemClick
事件中将播放歌曲。
我在使用这个的时候出现的问题:
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: start called in state 1
E/MediaPlayer: error (-38, 0)
E/MediaPlayer: Should have subtitle controller already set
E/MediaPlayer: Error (-38,0)
请修改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 中将此监听器代码放在列表视图的 onclicklistner 之前
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
if (mp.isPlaying())
mp.stop();
else
mp.start();
}
});