Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Androidでオーディオアプリを作るということ

rmakiyama
September 26, 2020

 Androidでオーディオアプリを作るということ

Androidでオーディオアプリを作るときに考慮すべきところなどを簡単に。

rmakiyama

September 26, 2020
Tweet

More Decks by rmakiyama

Other Decks in Technology

Transcript

  1. "OESPJEͰ
    ΦʔσΟΦΞϓϦΛ
    ࡞Δͱ͍͏͜ͱ
    Zli x ΤΩαΠτ ߹ಉLT

    2020/09/26 ryo makiyama

    View Slide

  2. ɹɹࣗݾ঺հ
    •຀ࢁྎ

    •Radiotalkגࣜձࣾ

    •AndroidΤϯδχΞ

    • @_rmakiyama

    • rmakiyama

    View Slide

  3. Ի੠Λ࠶ੜ͢Δ

    View Slide

  4. Ի੠Λ࠶ੜ͢Δʹ͸ʁ
    • AudioTrack

    • SoundPool

    • MediaPlayer

    • ExoPlayer

    • etc…

    View Slide

  5. Ի੠Λ࠶ੜ͢Δʹ͸ʁ
    • AudioTrack

    • ੜͷԻ੠σʔλΛѻ͑Δ

    • ࠷΋஗Ԇ͕গͳ͍

    • ѻ͍͕೉͍͠…
    • SoundPool

    • ୹͍Ի੠ʹద͍ͯ͠Δ

    • ޮՌԻͳͲ

    • ෛՙ͕௿͍

    • ஗Ԇ͕গͳ͍

    View Slide

  6. Ի੠Λ࠶ੜ͢Δʹ͸ʁ
    • MediaPlayer

    • ࠷΋Ұൠత

    • ө૾ʹ΋ରԠ

    • ѻ͍͕؆୯

    • HLSະରԠ
    • ExoPlayer

    • Google੡ͷϥΠϒϥϦ

    • ө૾ʹ΋ରԠ

    • ΧελϚΠζੑ͕ߴ͍

    • HLS΍DASH౳ʹରԠ

    View Slide

  7. ExoPlayer
    val audioUri = Uri.parse(“https:"//sample.jp/media/media1.mp3”)

    val player = SimpleExoPlayer.Builder(context).build()

    val sourceFactory = DefaultDataSourceFactory(

    context,

    Util.getUserAgent(context, "sample")

    )

    val extractorsFactory = DefaultExtractorsFactory()

    val source = ProgressiveMediaSource.Factory(sourceFactory, extractorsFactory)

    .createMediaSource(audioUri)

    player.prepare(source)

    View Slide

  8. ؆୯

    View Slide

  9. ؆୯

    View Slide

  10. ΦʔσΟΦΞϓϦʹٻΊΒΕΔ͜ͱ
    • όοΫάϥ΢ϯυͰ࠶ੜͰ͖Δ

    • ΠϠϗϯ͕ൈ͚ͨΒԻ੠͕ࢭ·Δ

    • ผͷΞϓϦͰԻ੠Λ࠶ੜ͢Δͱఀࢭ͢Δ

    • ༷ʑͳσόΠε͔Βૢ࡞͕Ͱ͖Δ

    • etc…

    View Slide

  11. Ͳ͏΍ͬͯ΍ͬͯΔͷ

    View Slide

  12. ΦʔσΟΦΞϓϦʹٻΊΒΕΔ͜ͱ
    • όοΫάϥ΢ϯυͰ࠶ੜͰ͖Δ

    • ΠϠϗϯ͕ൈ͚ͨΒԻ੠͕ࢭ·Δ

    • ผͷΞϓϦͰԻ੠Λ࠶ੜ͢Δͱఀࢭ͢Δ

    • ༷ʑͳσόΠε͔Βૢ࡞͕Ͱ͖Δ

    • etc…
    AndroidͷServiceΛར༻͢Δ

    View Slide

  13. ΦʔσΟΦΞϓϦʹٻΊΒΕΔ͜ͱ
    • όοΫάϥ΢ϯυͰ࠶ੜͰ͖Δ

    • ΠϠϗϯ͕ൈ͚ͨΒԻ੠͕ࢭ·Δ

    • ผͷΞϓϦͰԻ੠Λ࠶ੜ͢Δͱఀࢭ͢Δ

    • ༷ʑͳσόΠε͔Βૢ࡞͕Ͱ͖Δ

    • etc… ExoPlayerઌੜ͕΍ͬͯ͘ΕΔ

    View Slide

  14. ΦʔσΟΦΞϓϦʹٻΊΒΕΔ͜ͱ
    • όοΫάϥ΢ϯυͰ࠶ੜͰ͖Δ

    • ΠϠϗϯ͕ൈ͚ͨΒԻ੠͕ࢭ·Δ

    • ผͷΞϓϦͰԻ੠Λ࠶ੜ͢Δͱఀࢭ͢Δ

    • ༷ʑͳσόΠε͔Βૢ࡞͕Ͱ͖Δ

    • etc…

    View Slide

  15. headset watch tv auto

    View Slide

  16. ༷ʑͳσόΠε͔Β
    ૢ࡞͞ΕΔ͜ͱΛ
    ૝ఆ͢Δඞཁ͕͋Δ

    View Slide

  17. ΦʔσΟΦΞϓϦͷਪ঑ΞʔΩςΫνϟ
    • ΫϥΠΞϯτ/αʔόʔઃܭ

    • ϝσΟΞίϯτϩʔϥʔ(ΫϥΠΞϯτ)

    • ϝσΟΞηογϣϯ(αʔόʔ)

    • UI౳ʹΑΔૢ࡞ͱ

    ίϯςϯπ৘ใɾϓϨΠϠʔૢ࡞Λ෼͚ͨ
    ref. https:"//developer.android.com/guide/topics/media-apps/media-apps-overview

    View Slide

  18. UI/ϝσΟΞίϯτϩʔϥʔ(ΫϥΠΞϯτ)
    • UI͸ίϯτϩʔϥʔͷΈͱ΍ΓͱΓ

    • ϓϨΠϠʔࣗମͱ͸௚઀΍ΓऔΓΛ͠ͳ͍

    • ΞΫγϣϯ͸ηογϣϯ΁ͷίʔϧόοΫʹ

    • ۂ৘ใͷมߋͳͲ͸ηογϣϯ͔Β

    ίϯτϩʔϥʔ͕ίʔϧόοΫܗࣜͰड͚औΔ

    View Slide

  19. ϝσΟΞηογϣϯ/ϓϨΠϠʔ(αʔόʔ)
    • 1ͭͷηογϣϯͰෳ਺ͷίϯτϩʔϥʔ͔Β

    ίʔϧόοΫΛड͚Δ͜ͱ͕Ͱ͖Δ

    • ϓϨΠϠʔ͸ηογϣϯ͔ΒͷΈૢ࡞͞ΕΔ

    • ίϯτϩʔϥʔ͔ΒͷίʔϧόοΫʹΑΓૢ࡞

    View Slide

  20. ΦʔσΟΦΞϓϦ֓ཁ
    ref. https:"//developer.android.com/guide/topics/media-apps/media-apps-overview
    controller session player
    ui
    devices/controller

    View Slide

  21. ࣮૷ฤ%

    View Slide

  22. ΦʔσΟΦΞϓϦ֓ཁʢ࣮૷دΓʣ
    ref. https:"//developer.android.com/guide/topics/media-apps/media-apps-overview

    View Slide

  23. MediaBrowserService(session/player)
    class MyMediaService : MediaBrowserServiceCompat() {

    private lateinit var mediaSession: MediaSessionCompat

    private lateinit var player: Player

    override fun onCreate() {

    super.onCreate()

    mediaSession = MediaSessionCompat(this, "MyMediaService").apply {



    setCallback(myCallback)

    ɹɹɹɹɹɹ …

    View Slide

  24. MediaBrowserService(session/player)
    override fun onCreate() {



    }

    private val myCallback = object : MediaSessionCompat.Callback() {

    override fun onPrepare() {}

    override fun onPlay() {}

    override fun onPause() {}

    override fun onStop() {}



    }

    View Slide

  25. MediaBrowserService(session/player)


    override fun onGetRoot(

    clientPackageName: String,

    clientUid: Int,

    rootHints: Bundle?

    ): BrowserRoot? {

    "// ઀ଓ͞ΕͨΫϥΠΞϯτͷݕূΛ͢Δ

    "// ઀ଓΛڋ൱͢Δͱ͖͸nullΛฦ͢

    return BrowserRoot("root", null)

    }

    View Slide

  26. MediaBrowserService(session/player)
    …

    override fun onLoadChildren(

    parentId: String,

    result: Result>

    ) {

    "// ΫϥΠΞϯτʹϝσΟΞͷϦετΛฦ͢

    val list = getMetadata()

    result.sendResult(list)

    }



    View Slide

  27. Activity(UI/controller)
    class MediaPlayerActivity : AppCompatActivity() {

    private lateinit var mediaBrowser: MediaBrowserCompat

    private lateinit var mediaController: MediaControllerCompat

    override fun onCreate(savedInstanceState: Bundle?) {



    mediaBrowser = MediaBrowserCompat(

    this,

    ComponentName(this, MyMediaService"::class.java),

    connectionCallbacks,

    null

    View Slide

  28. Activity(UI/controller)
    class MediaPlayerActivity : AppCompatActivity() {

    private lateinit var mediaBrowser: MediaBrowserCompat

    private lateinit var mediaController: MediaControllerCompat

    override fun onCreate(savedInstanceState: Bundle?) {



    }

    override fun onStart() {

    super.onStart()

    "// MediaBrowserServiceʹ઀ଓ

    mediaBrowser.connect()

    View Slide

  29. Activity(UI/controller)
    class MediaPlayerActivity : AppCompatActivity() {



    private lateinit var mediaController: MediaControllerCompat



    private val connectionCallbacks = object : MediaBrowserCompat.ConnectionCallback() {

    override fun onConnected() {

    "// sessionͷτʔΫϯ͔ΒcontrollerΛੜ੒

    mediaController = MediaControllerCompat([email protected], mediaBrowser.sessionToken)

    .apply { registerCallback(controllerCallback) }

    "// UIͷૢ࡞ʹԠͯ͡controllerΛհͯ͠ΦʔσΟΦΛૢ࡞

    "// ྫ) ࠶ੜɿmediaController.transportControls.play()

    View Slide

  30. Activity(UI/controller)
    class MediaPlayerActivity : AppCompatActivity() {



    private var controllerCallback = object : MediaControllerCompat.Callback() {

    override fun onMetadataChanged(metadata: MediaMetadataCompat?) {

    "// ࠶ੜதͷίϯςϯπ৘ใͷมԽʹԠͯ͡UIΛߋ৽

    }

    override fun onPlaybackStateChanged(state: PlaybackStateCompat?) {

    "// ࠶ੜͷঢ়ଶ(࠶ੜத΍ఀࢭ)ͷมԽʹԠͯ͡UIΛߋ৽͢Δ

    }

    }

    View Slide

  31. ׬શʹཧղͨ͠ʁ

    View Slide

  32. ·ͱΊ
    •Ի੠Λ࠶ੜ͢Δ͚ͩͳΒ؆୯ʂ&

    •ΦʔσΟΦΞϓϦͰߟྀ͢Δ͜ͱ͸ҙ֎ͱଟ͍

    • ࠓ೔࿩͍ͯ͠ͳ͍͜ͱ΋ͨ͘͞Μ͋Δ…ʂ

    •ڵຯ͕༙͍ͨΒ࡞ͬͯΈΑ͏ʂ'

    • खΛಈ͔͢ͷେࣄʂ%

    View Slide