Macで作業中に手元のAndroidウィジェットからSpotifyをサッと操作したくて手間取っている方も多いはずです。
この記事では実際に動く手順をステップごとに優しく案内します。接続方法の選び方や必要なツールの設定からトラブル対応や便利な自動化のコツまで幅広くカバーします。
| 項目 | 内容 |
|---|---|
| 実体験に基づく手順 | 筆者の現場で動いた設定を再現しやすくまとめています。 |
| プログラマ視点のトラブル対応 | 接続が不安定なときの原因切り分けやログの見方を分かりやすく説明します。 |
| 応用例と自動化ヒント | ウィジェット連携を活かした自動スイッチやショートカットの作り方を紹介します。 |
さあ気軽に始めてみましょう。設定は思ったよりシンプルで終わったあとは音楽操作がとても楽になります。
Android博士初めてで緊張する気持ちはよく分かりますが焦らなくて大丈夫です。わかりやすく手順を追っていけば確実にできるようになるので安心して進めてください。
MacでAndroidウィジェットからSpotifyを表示操作する基本手順


Mac上でAndroidウィジェットからSpotifyを表示操作するには大きく分けて二つの方法がある。一つは端末内の通知やMediaSessionを使って直接操作する方法で、もう一つはSpotifyWebAPIを使ってリモートで再生を制御する方法だ。
どちらを選ぶかは用途次第であるが手早く端末再生を操作したいならNotificationアクセス経由が簡単で、アカウント横断や遠隔制御が必要ならPKCEでOAuthを行いWebAPIを叩くのが向いている。開発環境はMac上のAndroidStudioと実機または最新エミュレータを用意してから始めてください。
NotificationアクセスでSpotify再生を直接操作する方法


Notificationアクセスを利用するとSpotifyの通知やMediaSessionを監視してMediaController経由で再生操作ができる。まずユーザーに通知アクセスを許可してもらいNotificationListenerServiceを実装して通知を受け取る準備をする必要がある。
実装上のポイントはSpotifyのパッケージ名でフィルタリングすることとAndroidのバージョン差へ対応することだ。サービスは設定の通知アクセス画面で有効にして実機でSpotifyが再生中であることを確認しながら動作確認するとよい。
NotificationListenerServiceでSpotifyのMediaControllerを取得する手順
NotificationListenerServiceを継承したクラスを作成してAndroidManifestにBIND_NOTIFICATION_LISTENER_SERVICE権限付きで登録する。
MediaSessionManagerのgetActiveSessionsを使ってSpotifyのMediaControllerを探す。通知からMediaSessionTokenが得られればそれを利用する方法もある。
取得したMediaControllerのtransportControlsを使ってplaypauseやskipなどの操作を行う準備を整える。
ウィジェットのボタンにPendingIntentを設定して再生操作を送る手順
ウィジェットのボタン押下で受け取るBroadcastReceiverを実装してIntentアクションを定義する。
RemoteViewsの該当ビューにgetBroadcastで作成したPendingIntentをセットしてウィジェットに割り当てる。
Receiver内で既存のMediaControllerに対してtransportControlsを呼び出すかメディアボタンIntentを送ってSpotifyを操作する。
Spotify Web APIを使ってウィジェットから再生を制御する方法


SpotifyWebAPIを使うとユーザーのアクセストークンを通じて再生エンドポイントを叩きリモートで再生を制御できる。ネイティブアプリからはPKCEを使ったOAuthでトークンを取得してからAPIを呼ぶ流れが推奨される。
注意点は再生エンドポイントの一部はPremiumアカウントが必要なこととトークンを安全に保管して期限管理やリフレッシュを行う必要があることだ。ウィジェットからはバックグラウンドワーカーで非同期にAPIを呼び出すのが安定する。
PKCEを使ったOAuthでアクセストークンを取得する流れ
Spotifyの開発者ダッシュボードでアプリを登録しリダイレクトURIを設定してクライアントIDを取得する。
ランダムなcodeverifierを生成しSHA256でcodechallengeを作成して認可URLに含めてブラウザで開く。
リダイレクトで受け取ったコードとcodeverifierを使ってtokenエンドポイントにPOSTしてアクセストークンを取得する。
ウィジェットの操作からバックグラウンドで再生エンドポイントを呼ぶ手順
ウィジェットのボタンからWorkManagerやCoroutineWorkerを起動してバックグラウンド処理に移す。
保存済みアクセストークンで/v1/me/player/playなどのエンドポイントを呼び、401ならリフレッシュ処理を行って再試行する。
操作結果に応じてRemoteViewsを更新してAppWidgetManagerで反映しユーザーに状態を知らせる。
通知やMediaSessionから現在再生中情報をウィジェットに表示する方法


通知やMediaSessionを使うと現在再生中の曲情報をウィジェットに表示できる。NotificationListenerServiceから通知のextrasやMediaMetadataを取得して曲名やアーティスト情報を抜き出すのが標準的なやり方である。
アルバムアートは大きめのBitmapとして取得してRemoteViewsに設定する必要があるので非同期で読み込みを行いWidgetを更新することが大事だ。定期更新や通知受信で都度反映するとユーザー体験が良くなる。
NotificationListenerServiceで曲情報とアルバムアートを抽出する手順
onNotificationPostedでsbn.getPackageNameがcom.spotify.musicかを確認してSpotifyの通知だけ処理する。
Notification.extrasのEXTRA_TITLEやEXTRA_TEXTそれにMediaStyleのメディアセッション情報から曲名やアーティストを取り出す。
通知のlargeIconやextrasのBitmapを取得してそのままウィジェット用に使うかURLがある場合は別途ダウンロードする。
Glideでアルバムアートを取得してAppWidgetに反映する手順
Glide.with(context).asBitmap().load(urlorbitmap).submit().getを使ってバックグラウンドスレッドでBitmapを取得する。
取得したBitmapをRemoteViews.setImageViewBitmapでウィジェットに設定しAppWidgetManager.updateAppWidgetで反映する。
メインスレッドで同期的に読み込まないことと更新頻度が高すぎないようにしてバッテリー負荷を抑える。
Macで開発してAndroidウィジェットにSpotify連携の応用を加える方法


MacでAndroidウィジェットにSpotify連携を加えるときは、開発環境をスッキリ整えるのが大事です。AndroidStudioとadbを使いMac上でエミュレータや実機を切り替えながら動作確認すると効率が良くなります。
ここでは実用的な応用をいくつか挙げて、実装のヒントを優しく伝えます。省電力での位置同期やプレイリスト選択、多サイズ対応などすぐ使える手順を中心に説明します。
- MediaSessionとMediaControllerでイベント連携を行う方法。
- WorkManagerで定期更新してProgressBarを滑らかに更新する方法。
- RemoteViewsServiceでプレイリスト一覧を表示しサイズ別レイアウトを切り替える方法。
省電力で再生位置を同期する応用


再生位置の同期はバッテリー消費に直結するので注意が必要です。頻繁なポーリングを避け、MediaControllerのコールバックやイベント駆動で更新をトリガーするのが基本です。
背景での定期処理はWorkManagerに任せて、制約で省電力状態やネットワークを考慮します。ユーザー操作時は即時更新し、平常時は更新間隔を長めにする設計が現実的で扱いやすいです。
WorkManagerで定期更新を行いProgressBarを更新する手順
PeriodicWorkRequestを作成し実行間隔とBackoffPolicyを設定します。Constraintsで電源やネットワーク条件を指定して無駄な実行を抑えます。
Worker内でMediaControllerから再生位置を取得しAppWidgetManagerでRemoteViewsのProgressBarを更新します。更新頻度は短くても5秒程度を目安にします。
バッテリーセーバー時や低電力時はConstraintsで実行を停止します。ユーザー操作でキャンセルできるPendingIntentを用意しておくと親切です。
MediaControllerからの位置取得とウィジェット更新の実装ポイント
- MediaController.Callbackで位置変化を受け取り優先的にWidget更新を行う。ただし更新頻度は制限する。
- getPlaybackStateやgetPlaybackPositionで正確な位置を取得し、経過時間で推定位置を補正する。
- PendingIntentTemplateを使い各ウィジェットやリストアイテムで個別の動作を割り当てて競合を避ける。
ウィジェットでプレイリスト選択や複数サイズに対応する応用


ウィジェットでプレイリストを選べるようにすると操作性が大きく向上します。RemoteViewsServiceで一覧を用意し各アイテムに再生用のPendingIntentを付けて、タップで即座に再生できるようにします。
複数サイズに対応するにはサイズごとに別レイアウトを用意してonAppWidgetOptionsChangedで切り替えます。設定画面から表示項目を選べるようにしておくと利用者に優しいです。
RemoteViewsServiceでプレイリストを一覧表示する手順
RemoteViewsServiceを実装しRemoteViewsFactoryを用意します。onDataSetChangedでSpotifyからプレイリスト情報を取得します。
getViewAtで各行のRemoteViewsを生成し、fillIntentで再生用のIntentを設定します。タップで正しい曲が飛ぶようにします。
データ変更時はAppWidgetManager.notifyAppWidgetViewDataChangedを呼んで一覧を更新します。差分が出たらスムーズに反映させます。
AppWidgetProviderでサイズ別レイアウトと設定画面を切り替える手順
| 項目 | 内容 |
|---|---|
| 小サイズ(1×1) | 再生/一時停止ボタンのみを表示します。スペースを節約して最低限の操作を提供します。 |
| 中サイズ(2×2) | 曲名とProgressBarを配置します。WorkManagerで位置を定期更新すると見栄えが良くなります。 |
| 大サイズ(4×2以上) | プレイリスト一覧やカバー画像を表示します。RemoteViewsServiceでスクロール可能にして多機能にします。 |
よくある質問


- AndroidウィジェットからMacでSpotifyを操作できますか
はい。Android端末をUSBで接続してscrcpyなどで画面をミラーリングするとウィジェットをそのまま操作できます。Androidエミュレーター上でも同様にウィジェットが動きます。
- 準備するものは何ですか
Android端末またはエミュレーター、MacのADB環境、scrcpyやVysorのようなミラーリングツール、Spotifyアプリです。AndroidのUSBデバッグとmacOSの画面収録許可を忘れないでください。
- 遅延や動作制限はありますか
はい。ワイヤレス接続だと遅延が出やすくウィジェットの一部機能が反応しにくくなることがあります。安定性を重視する場合は有線接続でのミラーリングをおすすめします。
- よくあるトラブルと簡単な対処法は
ADBで端末が見えないときはケーブル交換やUSBデバッグの再確認をしてください。画面が映らないときはmacOSのアクセシビリティと画面収録の許可設定を見直すと解決することが多いです。
まとめ


ここまでで、Mac上にAndroidウィジェットを表示してSpotifyを操作する流れがひと通り揃います。USBでミラーリングしてウィジェットをクリックし、Mediaコマンドや自動化で再生や一時停止を送る手順を紹介しました。
運用のコツはUSB接続を優先して遅延を減らすことと、Androidをスリープさせない設定にすることです。Taskerなどの自動化でウィジェット操作に動作を割り当てると日常の操作がぐっと楽になります。
不具合が出たらADBの権限やMacのメディアキー設定を見直すと改善することが多いです。最初は設定が少し多く感じますが、慣れるとデスクトップから快適に音楽を操れるようになります。



落ち着いて一つずつ設定すれば必ず動きます。わからないところは焦らずチェックしながら進めてくださいね。
注意点として、ミラーリングや自動化は必要な権限を求めます。許可する項目はよく確認してから進めてください。
