やまものブログ

メモ書きブログです (^_^;A

音楽プレイヤー (3/4)

10日でおぼえる Androidアプリ開発入門教室 Android SDK2.3対応
の「CHAPTER 09 音楽プレイヤーを作ろう」の3つめ
LESSON 34 再生中の曲をステータスバーに表示しよう
の動作を確認しました。


今回のアプリでは、音楽の再生中にステータスバーにアイコンが表示されます。
下記、左側のオレンジ色のがそれです。イメージ 1

このアイコンは再生を一時停止しただけでも消えるようにこまめに操作されています。

アイコンが表示されている領域を展開すると、再生中のファイル名が表示されます。
イメージ 2

さらにこれをタップすると、アプリが起動します。


今回のコードでは deprecated なメソッドが1つ増えました。

まず、前回までは下記の3つでした。
constructor CursorAdapter(Context, Cursor)
managedQuery(Uri, String, String, String, String)
 (補足)対策は 2014/11/9(日) のブログ
onStart(Intent, int)
 (補足)対策は 2015/3/7(土) のブログ

新たに加わったのは Notification に関係する下記の2つです。
・コンストラクNotification(int icon, CharSequence tickerText, long when)
setLatestEventInfo (…)

対策前と対策後のコードを下記に示します。Notification.Builder なるものを使うように書き換えています。

【修正前】
285 Notification notification;
286 notification = new Notification(R.drawable.icon, title,
287         System.currentTimeMillis());
288 notification.flags = Notification.FLAG_NO_CLEAR
289          | Notification.FLAG_ONGOING_EVENT;
     : 中略
296 notification.setLatestEventInfo(this, getString(R.string.app_name),
297     album + "/" + title, contentIntent);

【修正後】
291 Notification notification = new Notification.Builder(this)
292         .setSmallIcon(R.drawable.icon)
293         .setContentText(title)
294         .setContentTitle(album.toString() + "/" + title.toString())
295         .setContentIntent(contentIntent)
296         .build();
297 notification.flags = Notification.FLAG_NO_CLEAR
298         | Notification.FLAG_ONGOING_EVENT;


ところで、表示されるアイコンですが、サンプルではドロイド君のアイコンになります。
それでは音楽プレイヤーっぽくないと思ったので、
http://free-illustrations.gatag.net/2014/05/14/120000.html
から頂いたフリー素材 で置き換えています。
 ※ 非営利目的の利用はフリーですが、ライセンスはクリエイティブ・コモンズさんにあります。

置き換えは、まず、画像データについては以下の手順で用意しました。
1) オリジナルの素材から、サイズを 72x72、48x48、36x36 の3種類にリサイズ
2) 形式を PNG に変更し
3) 開発環境 res/drawable-{h,m,l}dpi/icon2.png として保存

コードは src/jp/co/se/android/chapter09/MusicService.java にて、
R.drawable.icon
の指定があったところを
R.drawable.icon2
に書き換えました。

最後に、ビルドし直すと置き換え完了でした。


実行の確認は、当初、エミュレータではアイコンが表示されず、実機では表示されるという不可解な現象にあたっていました。しかし、エミュレータを新たに作成したところ問題なく動作したので、以前から使っているエミュレータに何らかの不都合が発生したのでしょう。

今回は異常終了が無かったのでわりと楽でした