音楽プレイヤー

【Android Studio】シンプルな音楽プレイヤーの作り方 第5回 「再生位置と経過時間の更新」

ここまでの記事はこちら
 

今回は最後の仕上げ「再生位置SeekBarと経過時間ラベル・残り時間ラベルの更新」です。

再生位置のSeekBarを経過時間に合わせて動くようにして、
経過時間ラベルと残り時間ラベルも更新されるようにしていきます。

では、MainActivity.javaを開いてはじめていきましょう!
 

 


 

Threadの準備

8~28行目を追加します。

 

import

必要になるimportは2つです。

青いメッセージが出ている状態で「alt」と「return」を同時に押してimportします。

Message

Handler

import android.os.Handler;
import android.os.Message;

 

Warning

Handlerの部分がオレンジ色になっているかと思います。


 

アプリの動作に問題はありませんが、この記事の最後に解決法を追記しています。

 
 

SeekBarとラベルを更新する仕組み

Threadは一定時間毎に処理を行いたい時に使います。

このアプリでは
16行目 Thread.sleep(1000);
として1000ミリ秒毎に実行するようになっています。
 

1000ミリ秒毎に実行するのは13~16行目の処理で、以下の順番で実行されます。
 

① 現在の経過時間(getCurrentPosition)をMessageにセットする。
msg.what = mp.getCurrentPosition();
 

② Handlerにメッセージ(経過時間)を送る。
handler.sendMessage(msg);
 

③ Handler側で経過時間を受け取る。
int currentPosition = msg.what;
 

④ SeekBarとラベルを更新
(この後書いていきます。)
 

⑤ 1000ミリ秒後に再度 ① から実行
 

 

メモ

アクティビティのUI(SeekBarとラベル)の変更をする場合はHandlerを使います。

 
 

再生時間のSeekBarを更新

7行目を追加します。

 
 

経過時間ラベル・残り時間ラベルを更新

10~15行目、19~29行目を追加します。

 

createTimeLabel関数を作って、経過時間を「0:11」「1:49」のような形式にします。
 

14行目

残り時間は「totalTime(総時間) – currentPosition(経過時間)」をもとにラベルを作成します。
 

分と秒の計算

currentPositionやtotalTimeの単位はミリ秒です。

1秒 = 1000ミリ秒
1分 = 60秒 = 60000ミリ秒

 

分の計算
int min = time / 1000 / 60;
time(ミリ秒)を1000で割って秒にする→さらに60で割って分にします。
 

秒の計算
int sec = time / 1000 % 60;
time(ミリ秒)を1000で割って秒にする→それを60で割った時の余りが秒になります。

 

分と秒を計算したら、String型で「0:11」「1:49」という文字列を作成します。
 

25行目

if (sec < 10) timeLabel += "0";

秒数が1桁の場合は、数字の前に0を足しています。
例)1:4 → 1:04
 
 

(オプション)Warningを消す

最後に、オレンジ色になっている箇所を修正します。

これはメモリーリークの警告です。このままにしておいても、このアプリの動作に影響はありませんので、気にならない方は飛ばしてください。
 

Handlerの箇所を以下のように編集してください。

 
 

アプリを実行する

これで全て完成です!
正しく動くかどうか確認してみてください。
 

完成動画(音が出ます)

 
 

サンプルコード(完成版)

 
 

まとめ

お疲れ様でした!
ここまで読んでいただきありがとうございます。
 

ThreadとHandlerの動きについては、慣れるまでは難しいかもしれません。

私も初めて使った時は説明を読んでも全くピンとこなくて、
タイマーや簡単なゲームを開発しながら、徐々に理解できるようになりました。
 

私は本やドキュメントを読むよりも、とにかくたくさんコードを書いて習得していくのが一番だと考えています。

今回の音楽プレイヤー以外にも、ThreadとHandlerを使ったサンプルを公開していきたいと考えています。

今後もプログラミングを少しでも楽しんでいただければ嬉しいです ????
 
 

ABOUT ME
Sara
Sara
「わかりやすく・シンプル」をモットーに、携帯アプリ・ウェブアプリの作り方を紹介します。 独学でプログラミングを勉強をしている方、基礎は勉強したけれど次に何をすれば良いか分からない...という方のお役に立てるサイトを目指しています🙂
独学は難しそうと感じたら

 
独学でプログラミングを勉強するのは難しそう、効率的にプログラミングを学びたいという方はオンラインスクールがオススメです。

オンラインスクールを選ぶときのポイント

  • 無料体験があること
  • 個別サポートがあること

自分にあったスタイルを見つけるために、無料体験のご利用をオススメします。(無料体験後に自分には合わないなと感じたらハッキリ断ってしまって問題ありません。)
 
個別サポートもプログラミング学習に挫折しないために重要なポイントです。エラーや困った時にすぐに個別対応をしてくれるスクールを利用して下さい。

ここでは3つのオンラインスクールを紹介します。
全て無料体験がありますので、ぜひ自分に合ったスクールを見つけてみて下さい????
 

1. TechAcademy(テックアカデミー)

オンライン完結で勉強できるスクールで、コースがとても充実しています。チャットで質問すればすぐに回答を得られるのが一番のおすすめポイントです。
オリジナルのサービスやアプリの開発もサポートしてくれるので、開発したいものが決まっている人にもオススメです。

無料体験はこちら

2. CodeCamp(コードキャンプ)

一対一で受講できる個別指導のプログラミングスクールです。
Webデザイン・Webサービス開発・アプリ開発などを幅広く学習することができます。
マンツーマンなので自分のペースで学習できて、質問もその都度できるのがメリットです。

無料体験レッスンはこちら

3. Treehouse

英語でも良い、英語とプログラミングを同時に勉強したいという方は Treehouse がオススメです。月25ドルで始めることができて、たくさんのプログラミング言語を学ぶことができます。
個別サポートはありませんが、掲示板が充実しています。ほとんどの場合、質問してから30分程度で回答を得ることができます。

7日間の無料体験はこちら

POSTED COMMENT

  1. アバター 今日の晩飯カツ丼 より:

    とても分かり易かったです!ありがとうございましたm(_ _)m

    細かいですが、一つ改善点があるとすれば再生時間のSeekBarが1秒ごとに更新される仕組みなので、再生時間を動かした時に再生時間がカクカクと更新されているので49行目に
    Message msg = new Message();
    msg.what = mp.getCurrentPosition();
    handler.sendMessage(msg);
    を追加したほうがより良くなると思います

    • Sara Sara より:

      今日の晩飯カツ丼さん、コメントありがとうございます!
      改善点も教えて頂いてありがとうございます。こちら確認させて頂きます????

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA