简体   繁体   English

将URI与Android MediaPlayer一起使用将返回“路径为null”和NullPointerException

[英]Using URI with Android MediaPlayer returns “path is null” and NullPointerException

I am trying to set a button inside a RecyclerView Adapter that play media files that have their URI stored in a database. 我试图在RecyclerView适配器中设置一个按钮,该按钮播放媒体文件,这些文件的URI存储在数据库中。 I get the URI correctly as the log shows, however, the app crashes and MediaPlayer does not work. 如日志所示,我正确获取了URI,但是,应用程序崩溃了, MediaPlayer无法正常工作。 Here is the AudioAdapter Code: 这是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());
    }
}

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. 感谢您在告诉我代码中有什么问题使MediaPlayer无法使用URI时所提供的帮助。

From what i'm seeing from the log 从我从日志中看到的

source is ::content://com.android.providers.media.documents/document/audio%3A17* 来源是:: content://com.android.providers.media.documents/document/audio%3A17*

The URI returned from the database doesn't seem to be valid 从数据库返回的URI似乎无效

You should verify it again my friend 你应该再次验证我的朋友

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM