0

友達 小さな mp3 サウンドトラック (ポッドキャスト) を再生するアプリケーションを開発しています。以下に示す私のコードは、Android 3.2 で正常に動作しています。しかし、Android 4.1.2 では、SeekBar はハンドラー インスタンスによって更新されません。この問題を引き起こしている SeekBarのバグについて読みましたが、Android 3.2 以降で修正する必要があります。ヘルプやアドバイスをいただければ幸いです。これが私のコードです:

public class PodcastDetailFragment extends BaseFragment {
    private MediaPlayer mediaPlayer = null;
    private Button playPauseButton = null;
    private SeekBar seekBar = null;
    private TextView timeView = null;
    private int totalDuration = 0;
    private Bundle data;

    private Handler handler=new Handler();

    private Runnable runnable  = new Runnable() {
        public void run() {
            int progress = mediaPlayer.getCurrentPosition();

            seekBar.setProgress(progress);

            int hours = ((progress/1000)/60)/60;
            int minutes = ((progress/1000)/60)%60;
            int seconds = ((progress/1000)%60)%60;
            String hoursString = (hours<10)?"0":"";
            String minutesString = (minutes<10)?"0":"";
            String secondsString = (seconds<10)?"0":"";

            timeView.setText(hoursString+hours+":"+minutesString+minutes+":"+secondsString+seconds);
            handler.postDelayed(this, 100);

        }
    };

    public static PodcastDetailFragment newInstance(Bundle bundle) {
        PodcastDetailFragment f = new PodcastDetailFragment();
        f.setArguments(bundle);
        return f;
    }

    /**
     * When creating, retrieve this instance's number from its arguments.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        data = getArguments();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {

        getView().findViewById(R.id.preparing_track_progress_bar).setVisibility(View.VISIBLE);

        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public void onPause() {
        super.onPause();
        if (mediaPlayer != null) {
            LogUtils.d("Podcast MediaPlayer", "stop() inside the onPause() was called");
            mediaPlayer.stop();
        }
    }

    @Override
    public void onDestroy() {
        LogUtils.d("Podcast MediaPlayer", "release() was called");
        mediaPlayer.release();
        super.onDestroy();
    }



    /**
     * The Fragment's UI is just a simple text view showing its instance number.
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.podcasts_details, container, false);


        TextView dv = (TextView) v.findViewById(R.id.durationView);
            dv.setText(data.getString("duration"));

        timeView = (TextView) v.findViewById(R.id.timeView);
            timeView.setText("00:00:00");

            playPauseButton = (Button) v.findViewById(R.id.playPauseButtonView);
            playPauseButton.setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {
                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.pause();
                        playPauseButton.setText(getResources().getString(
                                R.string.play));
                    } else {

                        mediaPlayer.start();
                        playPauseButton.setText(getResources().getString(
                                R.string.pause));
                    }
                }
            });
            seekBar = (SeekBar) v.findViewById(R.id.seekBarView);
            seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                public void onStopTrackingTouch(SeekBar seekBar) {
                }

                public void onStartTrackingTouch(SeekBar seekBar) {
                }

                public void onProgressChanged(SeekBar seekBar, int progress,
                        boolean fromUser) {
                    if (fromUser) {
                        mediaPlayer.seekTo(progress);

                    }
                }
            });

            mediaPlayer =new MediaPlayer();

            mediaPlayer
                    .setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        public void onPrepared(MediaPlayer mp) {
                            totalDuration = mp.getDuration();
                            seekBar.setMax(totalDuration);
                            playPauseButton.setEnabled(true);
                            try{
                            getView().findViewById(R.id.preparing_track_progress_bar).setVisibility(View.INVISIBLE);
                            }catch(Exception ex){
                                ex.printStackTrace();
                            }
                            handler.postDelayed(runnable, 100);

                        }

                    });
            mediaPlayer.setDataSource(Uri.parse(data.getString("podcast_url")).toString());
            playPauseButton.setEnabled(false);
            mediaPlayer.prepareAsync();






        return v;




    }




}
4

2 に答える 2