I am trying to set a button inside a RecyclerView
Adapter that play media files that have their URI
stored in a database. I get the URI correctly as the log shows, however, the app crashes and MediaPlayer
does not work. Here is the AudioAdapter
Code:
public class AdapterAudio extends RecyclerView.Adapter<AdapterAudio.AudioViewHolder> {
public static Context cxt;
private ArrayList<Audio_Model> audioData = new ArrayList<>();
// constructor
public AdapterAudio(ArrayList<Audio_Model> audioData) {
this.audioData = audioData;
}
@Override
public AudioViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.audio_item, parent, false);
AudioViewHolder holder = new AudioViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final AudioViewHolder holder, final int position) {
Audio_Model item = audioData.get(position);
holder.title.setText(item.getAudio_title());
holder.performer.setText(item.getAudio_content());
}
}
PLAY AUDIO BUTTON
holder.playAudio.setOnClickListener(new View.OnClickListener() {
MediaPlayer mediaPlayer = new MediaPlayer();
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()) {
pauseMusic();
} else {
playMusic();
}
}
public void playMusic() {
Audio_Model details = audioData.get(position);
String source = details.getAudio_source();
Uri audioUri = Uri.parse(String.valueOf(source));
Log.v("Audio source is: ", String.valueOf(audioUri));
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(cxt, audioUri);
} catch (Exception e) {
e.printStackTrace();
}
try {
mediaPlayer.prepare();
} catch (Exception e) {
e.printStackTrace();
}
mediaPlayer.start();
}
public void pauseMusic() {
if (mediaPlayer != null) {
mediaPlayer.pause();
}
}
protected void onDestroy() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
}
});
Recycler View Methods
@Override
public int getItemCount() {
return audioData.size();
}
public class AudioViewHolder extends RecyclerView.ViewHolder {
public final Context context;
public TextView title;
private Audio_Model myAudio;
private int mId;
private TextView performer;
private Button playAudio;
public AzkaryViewHolder(View itemView) {
super(itemView);
context = itemView.getContext();
CardView cardView = (CardView) itemView.findViewById(R.id.audio_item_play);
title = (TextView) itemView.findViewById(R.id.audio_item_title_textViewId);
performer = (TextView) itemView.findViewById(R.id.audio_item_performer_textViewId);
playAudio = (Button) itemView.findViewById(R.id.audio_play);
playAudio.setBackgroundResource(R.drawable.play_pause);
}
}
The Log I am getting with the error message is Below:
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer V/MediaPlayer: isPlaying: no active player
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer V/MediaPlayer-JNI: isPlaying: 0
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer V/Audio source is:: content://com.android.providers.media.documents/document/audio%3A17
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer V/MediaPlayer-JNI: native_setup
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer V/MediaPlayer: constructor
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer V/MediaPlayer: setListener
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer V/MediaPlayer-JNI: setAudioStreamType: 3
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer V/MediaPlayer: MediaPlayer::setAudioStreamType
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer I/MediaPlayer: path is null
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer W/System.err: java.lang.NullPointerException
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer W/System.err: at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1031)
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer W/System.err: at android.media.MediaPlayer.setDataSource(MediaPlayer.java:986)
10-19 20:29:37.698 9693-9693/com.myapp.audioplayer W/System.err: at audio.AdapterAudio$1.playMusic(AdapterAudio.java:151)
I appreciate your help in telling me what is wrong in my code that makes MediaPlayer does not work with URI.
From what i'm seeing from the log
source is ::content://com.android.providers.media.documents/document/audio%3A17*
The URI returned from the database doesn't seem to be valid
You should verify it again my friend
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.