![](/img/trans.png)
[英]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.