質問内容
質問を評価する
(0ポイント)
|
Chorometerで一時停止後リスタートの実装がわからないんです。 ソースコード上ではあってるはずなのに現状ではどうしても画面が呼び出されたときにChorometerが開始される、0:05時に一時停止ボタンを押す→5秒後に0:05にはならず0:10になってしまいます。 アドバイス程お願いします。
200行ほどの長いコードですが載せます。
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(); }
}
//アーティスト名、音楽のタイトル名、アルバム名を管理するメソッド private void initMediaDate() {
} //ライフサイクルが破棄された時に呼び出される protected void onDestroy(){ super.onDestroy(); Log.d("onDestroy", "ライフサイクルの破棄された状態です"); music.reset(); music.release();
} //Activityが前面になる時に呼び出される。 protected void onResume(){ super.onResume(); Log.d("onResume", "ライフサイクルの状態でResumeの状態です"); } //音楽を再生させるメソッド private void musicPlay() { seekBar =(SeekBar)findViewById(R.id.seekBar_id); //インテントを取得 Intent intent = getIntent(); // インテントに保存されたデータを取得 String data = intent.getStringExtra("keyword"); try { music.setDataSource(data); music.prepare(); music.start(); } catch (IllegalArgumentException e) {
e.printStackTrace(); } catch (SecurityException e) {
e.printStackTrace(); } catch (IllegalStateException e) {
e.printStackTrace(); } catch (IOException e) {
e.printStackTrace(); }
} /** *@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();
}
}else if(v==repetMusicButton){//繰り返し再生ボタンが押された時の処理 if(!music.isPlaying()){//再生されていなかったら //Toast.makeText(this, "再生ボタンを押して下さい。", Toast.LENGTH_LONG).show(); }else{ music.setLooping(true);//選んだ曲を繰り返し再生する //Toast.makeText(this, "原曲を繰り返し再生しました", Toast.LENGTH_LONG).show(); } }else if(v==rewindButton){//巻き戻しボタンが押された時の処理 music.seekTo(0);//選んだのシーク時間を0にして巻き戻す Toast.makeText(this, "音楽が巻き戻されました", Toast.LENGTH_LONG).show(); chorotemer.setBase(SystemClock.elapsedRealtime());//クロノメーターをリセット
} }
/** * 再生完了時ののイベント * @param mp */ public void onCompletion(MediaPlayer mp) { Log.d("Comnplete", "音楽が終了されました"); chorotemer.setBase(SystemClock.elapsedRealtime());//クロノメーターを0に戻す playButton.setBackgroundResource(R.drawable.musicplay); chorotemer.stop();
} /** *音楽の再生時間を表示させるメソッド * @param duration * @return str */ private String TimeText(int time) { int m = (int)(time / 60000); int s = (int)(time % 60000 / 1000);
String str = ""; if (m > 10 && s > 10) str = "" + m + ":" + s; else if (m < 10 && s >= 10) str = "0" + m + ":" + s; else if (m >= 10 && s < 10) str = "" + m + ":" + "0" + s; else if (m < 10 && s < 10) str = "0" + m + ":" + "0" + s;
return str; } }
|