繁体   English   中英

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

[英]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.

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