[英]MediaPlayer.create(Context, Uri) returns null, if Uri points to a file which has been renamed using FileExplorer
[英]Using URI with Android MediaPlayer returns “path is null” and NullPointerException
我试图在RecyclerView
适配器中设置一个按钮,该按钮播放媒体文件,这些文件的URI
存储在数据库中。 如日志所示,我正确获取了URI,但是,应用程序崩溃了, MediaPlayer
无法正常工作。 这是AudioAdapter
代码:
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());
}
}
播放音频按钮
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;
}
}
});
回收者查看方法
@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);
}
}
我收到错误消息的日志如下:
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)
感谢您在告诉我代码中有什么问题使MediaPlayer无法使用URI时所提供的帮助。
从我从日志中看到的
来源是:: content://com.android.providers.media.documents/document/audio%3A17*
从数据库返回的URI似乎无效
你应该再次验证我的朋友
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.