MediaPlayer の概要

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 を渡す場合、そのファイルが プログレッシブ ダウンロード

注意: キャッチまたはパスを IllegalArgumentExceptionIOException(使用時) 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() を呼び出すことができます。 メディアを再生します。図が示すように、この時点で StartedPausedPlaybackCompleted の各ステータスは、次の方法で移動できます。 呼び出しなどのメソッドを 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.OnErrorListenerMediaPlayer インスタンスで設定します。

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 を使用するために、次の手順を行います。

  1. アプリでカスタム構成を行う場合は、 OnDrmConfigHelper インターフェースを作成し、 使用するプレーヤー setOnDrmConfigHelper()
  2. prepare() を呼び出します。
  3. getDrmInfo() を呼び出します。ソースに DRM がある場合 コンテンツがある場合、メソッドは null 以外の MediaPlayer.DrmInfo の値。

MediaPlayer.DrmInfo が存在する場合:

  1. 使用可能な UUID のマップを調べ、1 つを選択します。
  2. prepareDrm() を呼び出して、現在のソースに対する DRM 設定を準備します。
    • 以前に作成した OnDrmConfigHelper コールバックは、 一方 prepareDrm() 確認できます。これにより、DRM のカスタム構成を実行できます。 DRM セッションを開く前に、いくつかのプロパティを設定します。このコールバックは 呼び出したスレッドで同期的に prepareDrm()。宛先 DRM プロパティへのアクセス、 getDrmPropertyString()setDrmPropertyString()。 長時間の操作は避けてください。
    • デバイスがまだプロビジョニングされていない場合 その他: prepareDrm() プロビジョニング サーバーにアクセスしてデバイスをプロビジョニングします。これには 一定時間待機する必要があります。
  3. ライセンス サーバーに送信する不透明なキーリクエストのバイト配列を取得するには、 getKeyRequest()
  4. ライセンス サーバーから受信した鍵応答について DRM エンジンに通知するには、次のコマンドを使用します。 provideKeyResponse()。結果は、鍵リクエストの種類によって異なります。 <ph type="x-smartling-placeholder">
      </ph>
    • オフライン キーリクエストに対するレスポンスの場合、結果はキーセット ID になります。次を使用: restoreKeys() を含むこの鍵セット識別子を使用して、鍵を新しいシステムに復元します。 あります。
    • ストリーミングまたは解放のリクエストに対するレスポンスの場合、結果は null になります。

非同期での 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...

詳細

以下は音声と動画の録音、録画、保存、再生に関するトピックを扱うページです。