代码之家  ›  专栏  ›  技术社区  ›  mike-gallego

mediaPlayer.getDuration文件()在setDataSource之后返回0并使应用程序崩溃

  •  0
  • mike-gallego  · 技术社区  · 6 年前

    @Override
    public void onBindViewHolder(@NonNull final TrackHolder holder, final int position) {
        final Track track =tracks.get(position) ;
        holder.mInstrumentalName.setText(tracks.get(position).getInstrumentalName());
        holder.mProducer.setText(tracks.get(position).getProducer());
    
    
    
        holder.mPlayButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (start_notifying > 0) {
                    notifyItemChanged(previous_position, false);
    
                    previous_position = holder.getAdapterPosition();
                    Log.d("adapter", Integer.toString(holder.getAdapterPosition()));
                    holder.mPlayButton.change(false);
                } else {
                    start_notifying++;
                    holder.mPlayButton.change(false);
                    previous_position = holder.getAdapterPosition();
                }
    
    
                if (mediaPlayer.isPlaying()) {
                    Log.d("playing", "is_playing");
                    mediaPlayer.reset();
                    holder.mMusicSeekbar.setEnabled(true);
                    try {
                        mediaPlayer.setDataSource(tracks.get(position).getMusicLink());
    
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mediaPlayer) {
                            mediaPlayer.start();
                        }
                    });
                    mediaPlayer.prepareAsync();
    
                } else {
                    Log.d("playing", "just_started");
                    current_position = holder.getAdapterPosition();
                    mediaPlayer.reset();
                    holder.mMusicSeekbar.setEnabled(true);
                    try {
                        mediaPlayer.setDataSource(tracks.get(position).getMusicLink());
                        previous_link = tracks.get(position).getMusicLink();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    Log.d("playing", Integer.toString(mediaPlayer.getDuration())); // Error here, and causes crash. 
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mediaPlayer) {
                            mediaPlayer.start();
                        }
                    });
                    mediaPlayer.prepareAsync();
                }
    
    
    
            }
        });
    
        track.isPlaying = start_notifying < 0;
    
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mediaPlayer.stop();
                notifyItemChanged(previous_position, false);
                previous_position = -1;
                start_notifying = 0;
            }
        });
    
        holder.setItemClickListener(new ItemClickListener() {
            @Override
            public void onItemClick(View v, int pos) {
                Toast.makeText(context, Integer.toString(position), Toast.LENGTH_SHORT).show();
            }
        });
    }
    

    09-14 12:37:27.275 6401-6401/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                 Process: maginate.net.thebestrapper, PID: 6401
                                                 java.lang.IllegalStateException
                                                     at android.media.MediaPlayer.prepareAsync(Native Method)
                                                     at maginate.net.thebestrapper.essentials.TrackAdapter$1.onClick(TrackAdapter.java:130)
                                                     at android.view.View.performClick(View.java:5697)
                                                     at android.view.View$PerformClick.run(View.java:22526)
                                                     at android.os.Handler.handleCallback(Handler.java:739)
                                                     at android.os.Handler.dispatchMessage(Handler.java:95)
                                                     at android.os.Looper.loop(Looper.java:158)
                                                     at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Prakash S    6 年前

    你应该打电话mediaPlayer.getDuration文件()一旦准备好OnPreparedListener中的数据源,就回调

                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        mediaPlayer.getDuration()
                        mediaPlayer.start();
                    }
                });