Why is connectionCallback.onConnected() not called when connecting to mediaBrowser?

879 Views Asked by At

I'm just setting out with teaching myself about Android audio development, and I'm rather baffled as to why neither the onConnected nor the onConnectionFailed method of connectionCallback is called here. PodcastService is instantiated and its onGetRoot method is called, but the callback is not called. No error messages are given; the callback is simply not called. Any help would be great!

MainActivity.kt:

package com.davidwillett.audioapp

import android.content.ComponentName
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.support.v4.media.MediaBrowserCompat

class MainActivity : AppCompatActivity() {
    private val connectionCallback = object : MediaBrowserCompat.ConnectionCallback() {
        override fun onConnected() {
            println("ConnectionCallback.onConnected")
            super.onConnected()
        }

        override fun onConnectionFailed() {
            println("ConnectionCallback.onConnectionFailed")
            super.onConnectionFailed()
        }
    }

    private lateinit var mediaBrowser: MediaBrowserCompat

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mediaBrowser = MediaBrowserCompat(
            this,
            ComponentName(this, PodcastService::class.java),
            connectionCallback,
            null)
    }

    override fun onStart() {
        println("MainActivity.onStart")
        super.onStart()
        mediaBrowser.connect()
    }

    override fun onStop() {
        println("MainActivity.onStop")
        super.onStop()
        mediaBrowser.disconnect()
    }
}

PodcastService.kt:

package com.davidwillett.audioapp

import android.os.Bundle
import android.support.v4.media.MediaBrowserCompat
import androidx.media.MediaBrowserServiceCompat

class PodcastService : MediaBrowserServiceCompat() {
    override fun onGetRoot(
        clientPackageName: String,
        clientUid: Int,
        rootHints: Bundle?
    ): BrowserRoot? {
        println("PodcastService.onGetRoot")
        return BrowserRoot("root", null)
    }

    override fun onLoadChildren(
        parentId: String,
        result: Result<MutableList<MediaBrowserCompat.MediaItem>>
    ) {
        TODO("Not yet implemented")
    }
}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.davidwillett.audioapp">

    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name=".PodcastService"
            android:exported="false">
            <intent-filter>
                <action android:name="android.media.browse.MediaBrowserService" />
            </intent-filter>
        </service>
    </application>

</manifest>
1

There are 1 best solutions below

0
On

Sorry, I didn't do my research well enough!

A comment in the UAMP demo project states that: "In order for MediaBrowserCompat.ConnectionCallback.onConnected to be called, a MediaSessionCompat.Token needs to be set on the MediaBrowserServiceCompat."

So that'll be what's missing!