Android在线媒体播放器,带有搜索栏和播放暂停按钮



我想在recyclerview中创建一个列表,每个项目都有一个播放暂停按钮和一个搜索栏。我终于用这段代码使它,但当我点击播放按钮,它崩溃了,它不工作。

这段代码在您的媒体离线时工作,但是当我想在在线模式下使用它并从URL获取文件时,它会导致问题。

和android studio的错误指示到

. lang。在com.example.wp.VersionAdapter4.lambda$onBindViewHolder$0$com-example-wp-VersionAdapter4(VersionAdapter4.java:61) at com.example.wp.VersionAdapter4$$ExternalSyntheticLambda0上尝试调用空对象引用'void android.media. mediaplayer . mediaplayer . medionadapter4 .startmediaplayer(VersionAdapter4.java:252) '的虚拟方法'void android.media. mediaplayer . mediaplayer . medionadapter4 . setaudiostreamtype (int)'。onClick(未知来源:4)

,它不能以字符串

的形式获取文件我该如何解决这个问题?

public class VersionAdapter4 extends RecyclerView.Adapter<VersionAdapter4.VersionViewHolder>{
private MediaPlayer mediaPlayer;
Context context;
VersionAdapter4 adapter;
private final ArrayList<Version4> versionlist;
private int currentPlayingPosition;
private final SeekbarUpdater seekbarUpdater;
private VersionViewHolder playingHolder;
public VersionAdapter4(Context context, ArrayList<Version4> versionlist) {
this.versionlist = versionlist;
this.currentPlayingPosition = -1;
seekbarUpdater = new SeekbarUpdater();
this.context = context;
}
@NonNull
@Override
public VersionViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new VersionViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.raw3, parent, false));
}
@Override
public void onBindViewHolder(@NonNull VersionViewHolder holder, int position) {
Version4 version4 = versionlist.get(position);

boolean isExpandable = versionlist.get(position).isExpandable();
holder.expandableLayout.setVisibility(isExpandable ? View.VISIBLE : View.GONE);
if (position == currentPlayingPosition) {
playingHolder = holder;
updateplayingview();
} else {
updatenoneplayingview(holder);
}
}
public void onViewRecycled(VersionViewHolder holder) {
super.onViewRecycled(holder);
if (currentPlayingPosition == holder.getAdapterPosition()) {
updatenoneplayingview(playingHolder);
playingHolder = null;
}
}
private void updatenoneplayingview(VersionViewHolder holder) {
holder.sbProgress.removeCallbacks(seekbarUpdater);
holder.sbProgress.setEnabled(false);
holder.sbProgress.setProgress(0);
holder.btnplay.setText("play");
}
private void updateplayingview() {
playingHolder.sbProgress.setMax(mediaPlayer.getDuration());
playingHolder.sbProgress.setProgress(mediaPlayer.getCurrentPosition());
playingHolder.sbProgress.setEnabled(true);
if (mediaPlayer.isPlaying()) {
playingHolder.sbProgress.postDelayed(seekbarUpdater, 100);
playingHolder.btnplay.setText("pause");
} else {
playingHolder.sbProgress.removeCallbacks(seekbarUpdater);
playingHolder.btnplay.setText("play");
}
}
private class SeekbarUpdater implements Runnable {
@Override
public void run() {
if (null != playingHolder && null != mediaPlayer) {
playingHolder.sbProgress.setProgress(mediaPlayer.getCurrentPosition());
playingHolder.sbProgress.postDelayed(this, 100);
}
}
}
@Override
public int getItemCount() {
return versionlist.size();
}
public class VersionViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, SeekBar.OnSeekBarChangeListener {
//  Version3 version = versionsList.get(i);
SeekBar sbProgress;
Button btnplay;
RelativeLayout expandableLayout;
public VersionViewHolder(@NonNull View itemView) {
super(itemView);

linearLayout = itemView.findViewById(R.id.linear);
expandableLayout = itemView.findViewById(R.id.expandable);
btnplay = itemView.findViewById(R.id.track_play);
btnplay.setOnClickListener(this);
sbProgress = itemView.findViewById(R.id.seekbar);
sbProgress.setOnSeekBarChangeListener(this);
linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Version4 version4 = versionlist.get(getAdapterPosition());
version4.setExpandable(!version4.isExpandable());
notifyItemChanged(getAdapterPosition());
}
});
}
@Override
public void onClick(View view) {
if (getAdapterPosition() == currentPlayingPosition) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
} else {
mediaPlayer.start();
}
} else {
currentPlayingPosition = getAdapterPosition();
if (mediaPlayer != null) {
if (null != playingHolder) {
updatenoneplayingview(playingHolder);
}
mediaPlayer.release();
}
playingHolder = this;
try {
startmediaplayer(versionlist.get(currentPlayingPosition).getSong());
} catch (IOException e) {
e.printStackTrace();
}
}
updateplayingview();
}
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
if (b) {
mediaPlayer.seekTo(i);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
}
private void startmediaplayer(String  getsong) throws IOException {

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.reset();
mediaPlayer.setDataSource(getsong);
mediaPlayer.prepare();
mediaPlayer.start();

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
releasemediaplayer();
}
});

}
private void releasemediaplayer(){
if (null!=playingHolder){
updatenoneplayingview(playingHolder);
}
mediaPlayer.release();
mediaPlayer=null;
currentPlayingPosition=-1;
}

}

尝试实现preparelistenerprepareAsync

mMediaPlayer.setDataSource();

mMediaPlayer.setOnPreparedListener();

mMediaPlayer.prepareAsync();

最新更新