Android マルチメディア フレームワークは、一般的な各種メディアタイプの再生をサポートしているため、
を使用して、音声、動画、画像をアプリケーションに簡単に統合できます。音声または
スタンドアロン ファイル、アプリケーションのリソース(未加工リソース)に保存されているメディア ファイル、
ファイル システム内、またはネットワーク接続を介して到着するデータ ストリームなど、すべて MediaPlayer
API を使用します。
このドキュメントでは、
MediaPlayer
: メディア再生を書き込む
ユーザーおよびシステムと相互作用し、優れたパフォーマンスと
実現できます別の方法として、
ExoPlayer を使用する。これはカスタマイズ可能なオープンソース
MediaPlayer
では利用できない高性能機能をサポートするライブラリ
注: 音声データは標準出力でのみ再生できます。 ダウンロードします現時点で該当するのは、モバイル デバイスのスピーカーまたは Bluetooth ヘッドセットです。音を鳴らすことはできません 会話音声内のファイルが保存されます。
基本情報
Android フレームワークでの音声と動画の再生には、次のクラスを使用します。
MediaPlayer
- このクラスは、音声と動画の再生においてメインとなる API です。
AudioManager
- このクラスは、デバイスの音声ソースと音声出力の管理に使用します。
マニフェストの宣言
MediaPlayer を使用してアプリの開発を開始する前に、マニフェストに 関連する機能の使用を許可するよう、適切な宣言が必要です。
- インターネット権限 - MediaPlayer を使用してネットワークベースのストリーミングに
アプリケーションがネットワーク アクセスをリクエストする必要があります。
<uses-permission android:name="android.permission.INTERNET" />
- Wake Lock 権限 - プレーヤー アプリで画面を保持する必要がある場合
スリープモードから切り替えたり、
MediaPlayer.setScreenOnWhilePlaying()
またはMediaPlayer.setWakeMode()
メソッドを使う場合は、この権限をリクエストする必要があります。<uses-permission android:name="android.permission.WAKE_LOCK" />
MediaPlayer の使用
メディア フレームワークの最も重要なコンポーネントの 1 つは、
MediaPlayer
クラスです。このクラスのオブジェクトは、音声と動画の両方をフェッチ、デコード、再生できる
必要があります。次のような複数のメディアソースがサポートされています。
- ローカル リソース
- コンテンツ リゾルバから取得できるような内部 URI
- 外部 URL(ストリーミング)
Android がサポートしているメディア形式については、 サポートされているメディア 形式のページをご覧ください。
例を示します。
ローカルの未加工リソース(アプリケーションの
res/raw/
ディレクトリ):
Kotlin
var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1) mediaPlayer.start() // no need to call prepare(); create() does that for you
Java
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1); mediaPlayer.start(); // no need to call prepare(); create() does that for you
この例では、「raw」データはリソースであり、システムによって自動的に なんらかの方法で解析を試みます。ただし、このリソースの内容は、 未加工オーディオです適切にエンコードおよびフォーマットされた 1 つの 確認できます。
これは、システムでローカルに使用可能な URI から再生する方法です。 (たとえば、コンテンツ リゾルバから取得します)。
Kotlin
val myUri: Uri = .... // initialize Uri here val mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setDataSource(applicationContext, myUri) prepare() start() }
Java
Uri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioAttributes( new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
リモート URL から HTTP ストリーミングで再生する方法は次のとおりです。
Kotlin
val url = "http://........" // your URL here val mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setDataSource(url) prepare() // might take long! (for buffering, etc) start() }
Java
String url = "http://........"; // your URL here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioAttributes( new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); // might take long! (for buffering, etc) mediaPlayer.start();
注: オンライン メディア ファイルをストリーミングするために URL を渡す場合、そのファイルが プログレッシブ ダウンロード
注意: キャッチまたはパスを
IllegalArgumentException
と IOException
(使用時)
setDataSource()
です。これは、
ファイルが存在しない可能性があります。
非同期での準備
MediaPlayer
の使用は、
あります。ただし 他にもいくつかの点に注意して
一般的な Android アプリと正しく統合するために必要です。対象
たとえば、prepare()
の呼び出しは、
実行に長い時間がかかります。
メディアデータの取得とデコードが含まれる場合があります。他のプロバイダと同様に
実行に時間がかかることがあるため、
UI スレッドにルーティングされます。これを行うと、メソッドが戻るまで UI がハングします。
これはユーザー エクスペリエンスに悪影響を及ぼし、ANR(アプリケーション応答なし)エラーが発生する可能性があります。たとえ
リソースを迅速に読み込むことが期待されます
UI が応答するまで 1 秒かかると、顕著な一時停止が発生し、
アプリケーションの動作が遅いという印象をユーザーに与えます。
UI スレッドがハングしないように、別のスレッドを生成して
MediaPlayer
を準備し、完了したらメインスレッドに通知します。ただし、
スレッド ロジックを記述し、
MediaPlayer
を使用するときはこのパターンが一般的であるため、フレームワークでは
には、
prepareAsync()
メソッドを使用します。この方法は
バックグラウンドでメディアの準備を開始し、すぐに戻ります。メディアが
onPrepared()
の準備が完了すると、
MediaPlayer.OnPreparedListener
のメソッド(
setOnPreparedListener()
が呼び出されます。
状態の管理
MediaPlayer
のもう一つの注意点として、
状態ベースであるということです。つまり、MediaPlayer
には内部状態があります。
コードを記述する際には、注意すべき点が
プレーヤーが特定のステータスの場合にのみ有効です。Google Cloud コンソールでオペレーションを
誤った状態になった場合、システムは例外をスローしたり、その他の望ましくない動作を引き起こす可能性があります。
「
MediaPlayer
クラスは完全な状態図を示します。
どのメソッドが MediaPlayer
をある状態から別の状態に移行するかを明確にしています。
たとえば、新しい MediaPlayer
を作成すると、[アイドル状態] になります。
あります。その時点で、
setDataSource()
様、
初期化状態にします。その後、
prepare()
または
prepareAsync()
メソッドを使用します。日時
MediaPlayer
の準備が完了すると、Prepared
つまり start()
を呼び出すことができます。
メディアを再生します。図が示すように、この時点で
Started、Paused、PlaybackCompleted の各ステータスは、次の方法で移動できます。
呼び出しなどのメソッドを
start()
,
pause()
、および
seekTo()
,
挙げられますユーザーが
stop()
を呼び出しますが、
次の操作を行うまで start()
を再度呼び出すことはできません
MediaPlayer
を再度準備します。
常に状態図を維持してください。
ユーザーとやり取りするコードを書くときは
MediaPlayer
オブジェクト。これは、メソッドを誤った状態から呼び出すと、
一般的なバグの原因を特定します
MediaPlayer の解放
MediaPlayer
は貴重なデータを消費できる
システム リソースを管理します。
ですから、こうしたリスクを回避できるよう、
MediaPlayer
インスタンスに待機する時間を必要以上に長くします。ユーザーが
完了後に呼び出す必要があります。
release()
で、
システム リソースが適切に解放されるようにすることです。たとえば
MediaPlayer
を使用していて、アクティビティが onStop()
の呼び出しを受け取った場合は、MediaPlayer
を解放する必要があります。
なぜなら、
アクティビティがやり取りされていない間、保持しても意味がありません
ただし、バックグラウンドでメディアを再生している場合は除きます。バックグラウンドで再生している場合は、次のセクションで説明します。
アクティビティを再開または再開する際は、当然ながら、
新しい MediaPlayer
を作成して、再生を再開する前に再度準備します。
MediaPlayer
の解放と無効化は次のように行います。
Kotlin
mediaPlayer?.release() mediaPlayer = null
Java
mediaPlayer.release(); mediaPlayer = null;
例として、サーバー セキュリティを
アクティビティが停止したときに MediaPlayer
を解放するのを忘れたため、作成
アクティビティの再起動時に新しい ID を作成します。ご存じのように、ユーザーが
画面の向き(または別の方法でデバイス構成を変更した場合)
システムはアクティビティを再起動して(デフォルト)処理します。そのため、
ユーザーとしてすべてのシステム リソースを消費し、
デバイスを前後に回転させます。これは、
画面の向きを変更したときに、まったく新しい MediaPlayer
が作成されると、
なります。ランタイムの再起動の詳細については、構成の変更を処理するをご覧ください。
プレイを続けるとどうなるか、疑問に思われるかもしれません。
"バックグラウンド メディア"ユーザーがアクティビティから離れても
動作が異なるためですこの場合に必要なのは
Service によって制御される MediaPlayer
。
次のセクションで説明する
サービス内での MediaPlayer の使用
アプリの起動時もメディアをバックグラウンドで再生したい場合は、
つまり、ユーザーが操作している間も再生を継続させたい場合です。
他のアプリケーションと相互作用する場合、その API を
コントロール プレーンの
そこから MediaPlayer
個のインスタンスを実行します。
カスタム ディメンションを
MediaBrowserServiceCompat
サービスの MediaPlayer を使用し、
やり取りを行う
別のアクティビティの MediaBrowserCompat
。
このクライアント サーバーのセットアップには注意が必要です。期待値 バックグラウンド サービスで実行されているプレーヤーが、 ありませんアプリがこれらの要件を満たさない場合、 不快な体験をします。読む オーディオ アプリを作成する をご覧ください。
このセクションでは、サービス内に実装された MediaPlayer を管理する際の特別な手順について説明します。
非同期での実行
まず、Activity
のように、すべて
Service
は、
デフォルトです。実際、同じアプリからアクティビティとサービスを実行している場合、
デフォルトで同じスレッド(「メインスレッド」)を使用します。そのためサービスは
受け取ったインテントの処理を迅速化
レスポンス時に長時間の計算を実行しません高負荷の
ブロッキング呼び出しを行う場合は、これらのタスクを非同期で行う必要があります。
自分で実装するか、フレームワークの多くの機能を使用して
非同期処理に適しています
たとえば、メインスレッドから MediaPlayer
を使用する場合、
prepareAsync()
ではなく、
prepare()
を実行し、次の要素を実装します。
MediaPlayer.OnPreparedListener
プレイを開始できます。
例:
Kotlin
private const val ACTION_PLAY: String = "com.example.action.PLAY" class MyService: Service(), MediaPlayer.OnPreparedListener { private var mMediaPlayer: MediaPlayer? = null override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { ... val action: String = intent.action when(action) { ACTION_PLAY -> { mMediaPlayer = ... // initialize it here mMediaPlayer?.apply { setOnPreparedListener(this@MyService) prepareAsync() // prepare async to not block main thread } } } ... } /** Called when MediaPlayer is ready */ override fun onPrepared(mediaPlayer: MediaPlayer) { mediaPlayer.start() } }
Java
public class MyService extends Service implements MediaPlayer.OnPreparedListener { private static final String ACTION_PLAY = "com.example.action.PLAY"; MediaPlayer mediaPlayer = null; public int onStartCommand(Intent intent, int flags, int startId) { ... if (intent.getAction().equals(ACTION_PLAY)) { mediaPlayer = ... // initialize it here mediaPlayer.setOnPreparedListener(this); mediaPlayer.prepareAsync(); // prepare async to not block main thread } } /** Called when MediaPlayer is ready */ public void onPrepared(MediaPlayer player) { player.start(); } }
非同期エラーの処理
同期オペレーションでは、エラーは
例外またはエラーコードで通知されますが、
作成する際は、アプリケーションが通知を受け取れるように、
適切に検出できます。MediaPlayer
の場合、
そのためには、Terraform で
MediaPlayer.OnErrorListener
と
MediaPlayer
インスタンスで設定します。
Kotlin
class MyService : Service(), MediaPlayer.OnErrorListener { private var mediaPlayer: MediaPlayer? = null fun initMediaPlayer() { // ...initialize the MediaPlayer here... mediaPlayer?.setOnErrorListener(this) } override fun onError(mp: MediaPlayer, what: Int, extra: Int): Boolean { // ... react appropriately ... // The MediaPlayer has moved to the Error state, must be reset! } }
Java
public class MyService extends Service implements MediaPlayer.OnErrorListener { MediaPlayer mediaPlayer; public void initMediaPlayer() { // ...initialize the MediaPlayer here... mediaPlayer.setOnErrorListener(this); } @Override public boolean onError(MediaPlayer mp, int what, int extra) { // ... react appropriately ... // The MediaPlayer has moved to the Error state, must be reset! } }
エラーが発生すると、MediaPlayer
Error 状態に移行します(
完全な状態図の MediaPlayer
クラス)
再度使用できるようにするには、リセットする必要があります。
wake lock の使用
メディアを再生するアプリを設計する場合 バックグラウンドで動作している場合は、デバイスがスリープ状態になる場合があります。 維持できますAndroid システムは デバイスがスリープ中にバッテリーがオフになったりすると、 スマートフォンの機能を 必要ありません。これには CPU や Wi-Fi ハードウェアも含まれます。 ただし、サービスで音楽を再生またはストリーミングしている場合は、 システムが再生に干渉しないようにする必要があります。
サービスが Google Cloud 上で継続して実行されるよう 「ウェイクロック」を使用する必要があります。wake lock は、外部リソースへの アプリケーションが実際に使用する機能を アイドル状態のときでも通話を継続できる
注: wake lock は常に控えめに使用し、保持してください 本当に必要な期間だけ待機する ダウンロードします
MediaPlayer
が動作している間も CPU の実行が継続されるようにするには、
再生するには、MediaPlayer
を初期化するときに setWakeMode()
メソッドを呼び出します。完了したら、
MediaPlayer
が再生中に指定されたロックを保持し、ロックを解放する
一時停止または停止した場合:
Kotlin
mediaPlayer = MediaPlayer().apply { // ... other initialization here ... setWakeMode(applicationContext, PowerManager.PARTIAL_WAKE_LOCK) }
Java
mediaPlayer = new MediaPlayer(); // ... other initialization here ... mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
ただし、この例で取得した wake lock では、CPU が実行され続けることのみが保証されます。条件
ネットワークに接続していて、Wi-Fi を使用している場合は、
WifiLock
として
手動で取得してリリースする必要があります。したがって
MediaPlayer
をリモート URL に置き換えます。Wi-Fi ロックを作成して取得する必要があります。
例:
Kotlin
val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager val wifiLock: WifiManager.WifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock") wifiLock.acquire()
Java
WifiLock wifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE)) .createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock"); wifiLock.acquire();
メディアを一時停止または停止したときや、メディアの再生が不要になったとき ロックを解除する必要があります。
Kotlin
wifiLock.release()
Java
wifiLock.release();
クリーンアップの実施
前述のように、MediaPlayer
オブジェクトは大量のメモリを消費する可能性があります。
必要なときだけ保持しておき、必要に応じて
完了したら release()
。大事なこと
システムのガベージ コレクションを使用するのではなく、このクリーンアップ メソッドを明示的に呼び出すことをおすすめします。
ガベージ コレクタが MediaPlayer
を回収するまでに時間がかかることがあります。
メモリのニーズのみに影響を受け、他のメディア関連リソースの不足には影響しないからです。
そのため、サービスを使用する場合は、常に
onDestroy()
メソッドを使用して、リリースしていることを確認します。
MediaPlayer
:
Kotlin
class MyService : Service() { private var mediaPlayer: MediaPlayer? = null // ... override fun onDestroy() { super.onDestroy() mediaPlayer?.release() } }
Java
public class MyService extends Service { MediaPlayer mediaPlayer; // ... @Override public void onDestroy() { super.onDestroy(); if (mediaPlayer != null) mediaPlayer.release(); } }
MediaPlayer
をリリースする他の機会を常に模索する必要があります。
シャットダウン時に解放することもできますたとえば、想定外の
メディアを長時間再生できる(音声フォーカスが失われた場合など)
既存の MediaPlayer
を解放してもう一度作成する必要があります。
後で説明します
一方、ごく短時間だけ再生を停止する場合は、
作成と準備のオーバーヘッドを回避するために、MediaPlayer
を保持します。
もう一度クリックします。
デジタル著作権管理(DRM)
Android 8.0(API レベル 26)以降、MediaPlayer
には以下の API が含まれています。
DRM 保護された素材の再生をサポートしています。これは、Google Cloud で提供されている低レベル API と
MediaDrm
。ただし、より高レベルで動作し、
基盤となる extractor オブジェクト、drm オブジェクト、crypto オブジェクトを公開すること。
MediaPlayer DRM API は、メディア プレーヤーに
MediaDrm
は、最も一般的なユースケースをサポートしています。「
現在の実装では、次のコンテンツ タイプを処理できます。
- Widevine で保護されたローカル メディア ファイル
- Widevine で保護されたリモート(またはストリーミング)メディア ファイル
次のコード スニペットは、新しい DRM MediaPlayer を使用する方法を示しています。 メソッドを単純な同期実装に実装できます。
DRM で制御されるメディアを管理するには、新しいメソッドを MediaPlayer 呼び出しの通常のフローを以下に示します。
Kotlin
mediaPlayer?.apply { setDataSource() setOnDrmConfigHelper() // optional, for custom configuration prepare() drmInfo?.also { prepareDrm() getKeyRequest() provideKeyResponse() } // MediaPlayer is now ready to use start() // ...play/pause/resume... stop() releaseDrm() }
Java
setDataSource(); setOnDrmConfigHelper(); // optional, for custom configuration prepare(); if (getDrmInfo() != null) { prepareDrm(); getKeyRequest(); provideKeyResponse(); } // MediaPlayer is now ready to use start(); // ...play/pause/resume... stop(); releaseDrm();
まず、MediaPlayer
オブジェクトを初期化し、
setDataSource()
を使用してそのソースを表現し、
使用します。次に、DRM を使用するために、次の手順を行います。
- アプリでカスタム構成を行う場合は、
OnDrmConfigHelper
インターフェースを作成し、 使用するプレーヤーsetOnDrmConfigHelper()
。 prepare()
を呼び出します。getDrmInfo()
を呼び出します。ソースに DRM がある場合 コンテンツがある場合、メソッドは null 以外のMediaPlayer.DrmInfo
の値。
MediaPlayer.DrmInfo
が存在する場合:
- 使用可能な UUID のマップを調べ、1 つを選択します。
prepareDrm()
を呼び出して、現在のソースに対する DRM 設定を準備します。- 以前に作成した
OnDrmConfigHelper
コールバックは、 一方prepareDrm()
確認できます。これにより、DRM のカスタム構成を実行できます。 DRM セッションを開く前に、いくつかのプロパティを設定します。このコールバックは 呼び出したスレッドで同期的にprepareDrm()
。宛先 DRM プロパティへのアクセス、getDrmPropertyString()
、setDrmPropertyString()
。 長時間の操作は避けてください。 - デバイスがまだプロビジョニングされていない場合
その他:
prepareDrm()
プロビジョニング サーバーにアクセスしてデバイスをプロビジョニングします。これには 一定時間待機する必要があります。 - ライセンス サーバーに送信する不透明なキーリクエストのバイト配列を取得するには、
getKeyRequest()
。 - ライセンス サーバーから受信した鍵応答について DRM エンジンに通知するには、次のコマンドを使用します。
provideKeyResponse()
。結果は、鍵リクエストの種類によって異なります。 <ph type="x-smartling-placeholder">- </ph>
- オフライン キーリクエストに対するレスポンスの場合、結果はキーセット ID になります。次を使用:
restoreKeys()
を含むこの鍵セット識別子を使用して、鍵を新しいシステムに復元します。 あります。 - ストリーミングまたは解放のリクエストに対するレスポンスの場合、結果は null になります。
- オフライン キーリクエストに対するレスポンスの場合、結果はキーセット ID になります。次を使用:
非同期での prepareDrm()
の実行
デフォルトの prepareDrm()
は同期的に実行され、準備が完了するまでブロックされます。しかし、
新しいデバイスで最初の DRM 準備を行うときにも、プロビジョニングが必要になる場合があります。
データ アナリストが
prepareDrm()
、および
完了するまでに時間がかかることがあります。Google Chat では
ブロックしない
prepareDrm()
-
MediaPlayer.OnDrmPreparedListener
を定義して設定する。
OnDrmPreparedListener
を設定すると、
prepareDrm()
プロビジョニング(必要な場合)と準備をバックグラウンドで実行します。日時
プロビジョニングと準備が完了すると、リスナーが呼び出されます。すべきこと
呼び出しシーケンスや、スレッドが呼び出されているスレッドを
実行されます(リスナーがハンドラ スレッドに登録されている場合を除く)。
リスナーは、この関数の前後に呼び出すことができます。
prepareDrm()
返されます。
非同期での DRM の設定
DRM を非同期で初期化するには、
MediaPlayer.OnDrmInfoListener
: DRM の準備と
MediaPlayer.OnDrmPreparedListener
: プレーヤーを起動します。
これらは
prepareAsync()
(以下を参照)
Kotlin
setOnPreparedListener() setOnDrmInfoListener() setDataSource() prepareAsync() // ... // If the data source content is protected you receive a call to the onDrmInfo() callback. override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) { mediaPlayer.apply { prepareDrm() getKeyRequest() provideKeyResponse() } } // When prepareAsync() finishes, you receive a call to the onPrepared() callback. // If there is a DRM, onDrmInfo() sets it up before executing this callback, // so you can start the player. override fun onPrepared(mediaPlayer: MediaPlayer) { mediaPlayer.start() }
Java
setOnPreparedListener(); setOnDrmInfoListener(); setDataSource(); prepareAsync(); // ... // If the data source content is protected you receive a call to the onDrmInfo() callback. onDrmInfo() { prepareDrm(); getKeyRequest(); provideKeyResponse(); } // When prepareAsync() finishes, you receive a call to the onPrepared() callback. // If there is a DRM, onDrmInfo() sets it up before executing this callback, // so you can start the player. onPrepared() { start(); }
暗号化メディアの処理
Android 8.0(API レベル 26)以降では、MediaPlayer
でも復号できます
共通暗号化スキーム(CENC)と
エレメンタリー ストリーム タイプの場合、HLS サンプルレベルで暗号化されたメディア(Method=SAMPLE-AES)
H.264、AAC です。以前は、フルセグメント暗号化メディア(METHOD = AES-128)がサポートされていました。
ContentResolver からのメディアの取得
メディア プレーヤー アプリで役立つもう一つの機能として、
ユーザーがデバイス上にある音楽を取得します。これを行うには、次のように、外部メディアの ContentResolver
にクエリを送信します。
Kotlin
val resolver: ContentResolver = contentResolver val uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI val cursor: Cursor? = resolver.query(uri, null, null, null, null) when { cursor == null -> { // query failed, handle error. } !cursor.moveToFirst() -> { // no media on the device } else -> { val titleColumn: Int = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE) val idColumn: Int = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID) do { val thisId = cursor.getLong(idColumn) val thisTitle = cursor.getString(titleColumn) // ...process entry... } while (cursor.moveToNext()) } } cursor?.close()
Java
ContentResolver contentResolver = getContentResolver(); Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Cursor cursor = contentResolver.query(uri, null, null, null, null); if (cursor == null) { // query failed, handle error. } else if (!cursor.moveToFirst()) { // no media on the device } else { int titleColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE); int idColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID); do { long thisId = cursor.getLong(idColumn); String thisTitle = cursor.getString(titleColumn); // ...process entry... } while (cursor.moveToNext()); }
これを MediaPlayer
で使用するには、次のようにします。
Kotlin
val id: Long = /* retrieve it from somewhere */ val contentUri: Uri = ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id ) mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setDataSource(applicationContext, contentUri) } // ...prepare and start...
Java
long id = /* retrieve it from somewhere */; Uri contentUri = ContentUris.withAppendedId( android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioAttributes( new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ); mediaPlayer.setDataSource(getApplicationContext(), contentUri); // ...prepare and start...
詳細
以下は音声と動画の録音、録画、保存、再生に関するトピックを扱うページです。