- 締切済み
Chorometerで一時停止した後再開の実装
Chorometerで一時停止後リスタートの実装がわからないんです。 ソースコード上ではあってるはずなのに現状ではどうしても画面が呼び出されたときにChorometerが開始される、0:05時に一時停止ボタンを押す→5秒後に0:05にはならず0:10になってしまいます。 どうしてそうなるかをお願いします。 package com.exploreralpha; import java.io.IOException; import java.text.BreakIterator; import android.media.MediaPlayer.OnCompletionListener; import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.media.MediaPlayer; import android.os.Bundle; import android.os.SystemClock; import android.provider.MediaStore; import android.provider.MediaStore.Audio.AudioColumns; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Chronometer; import android.widget.Chronometer.OnChronometerTickListener; import android.widget.ProgressBar; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; //音楽再生,音楽停止,巻き戻し,繰り返し再生,一時停止,自前コントローラの機能を保有するクラス public class MusicPlayer extends Activity implements OnClickListener, OnCompletionListener { TextView textView; TextView musicEndTime; MediaPlayer music; Button playButton;//音楽再生/一時停止ボタン Button rewindButton;//巻き戻しボタン Button repetMusicButton;//繰り返し再生ボタン Chronometer chorotemer; Long startTime;//開始時間 Long stopTime;//停止時間 int duration;//ファイルの長さ(時間)を取得する変数 int currnetPosion;//現在の再生位置を取得する変数 TextView title;//曲名 TextView artst;//アーティスト名 TextView album;//アルバム名 AlertDialog.Builder dialog; SeekBar seekBar; boolean startFlag; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.music); music =new MediaPlayer(); musicPlay(); //それぞれのリソースIDを取得 playButton=(Button)findViewById(R.id.musicPuse_id); rewindButton=(Button)findViewById(R.id.rewind_id); repetMusicButton=(Button)findViewById(R.id.repetMusic_id); musicEndTime =(TextView)findViewById(R.id.musicEndtime); chorotemer=(Chronometer)findViewById(R.id.startTimer_id); artst =(TextView)findViewById(R.id.artstText_id); //それぞれのボタンが押された時の処理をセットするためsetOnClickListenerインタフェースを //それぞれのボタンにセットしてMusicPlayer本体に実装する playButton.setOnClickListener(this); rewindButton.setOnClickListener(this); repetMusicButton.setOnClickListener(this); music.setOnCompletionListener(this); chorotemer=(Chronometer)findViewById(R.id.startTimer_id); //最初に画面が生成した時に再生ボタンの画像を割り当てる playButton.setBackgroundResource(R.drawable.pause); initMediaDate(); duration =music.getDuration(); String timeStr=TimeText(duration); musicEndTime.setText(timeStr); // 初期値の設定 設定しないと端末が起動してからの時間からスタート if(music.isPlaying()){ startTime=SystemClock.elapsedRealtime(); chorotemer.setBase(startTime); chorotemer.start(); } } /** *@param v * 音楽再生ボタン,音楽停止ボタン,音楽一時停止ボタン,巻き戻しボタンが繰り返し再生ボタンが押された時の処理 */ public void onClick(View v) { if(v==playButton){//一時停止ボタンが押された時の処理 stopTime=SystemClock.elapsedRealtime(); if(music.isPlaying()){//音楽が再生されている時 playButton.setBackgroundResource(R.drawable.musicplay); //Toast.makeText(this, "一時停止されました。", Toast.LENGTH_LONG).show(); music.pause();//一時停止する chorotemer.stop(); }else{//音楽が再生されていない時 playButton.setBackgroundResource(R.drawable.musicpause); //Toast.makeText(this, "再生されました。", Toast.LENGTH_LONG).show(); Long time_1=stopTime-startTime; chorotemer.setBase(SystemClock.elapsedRealtime()-time_1); chorotemer.start(); music.start(); } }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- hirotn
- ベストアンサー率59% (147/246)
stopTime=SystemClock.elapsedRealtime(); //一時停止ボタンが押された時間 この文が、 if(music.isPlaying()){//音楽が再生されている時 このif文の前に実装されているため、再開の一時停止ボタンクリック時にもstopTimeが更新されます。これは意図した動作ではないと思われます。 直し方の一案ですが、一時停止時間の記録は再生中のみなので、music.isPlaying() == trueの時のみ取ればよいかと思われます。「音楽が再生されている時」のブロックの中に入れるとどうなるでしょうか。