为啥连接到 mediaBrowser 时没有调用 connectionCallback.onConnected()?

Posted

技术标签:

【中文标题】为啥连接到 mediaBrowser 时没有调用 connectionCallback.onConnected()?【英文标题】:Why is connectionCallback.onConnected() not called when connecting to mediaBrowser?为什么连接到 mediaBrowser 时没有调用 connectionCallback.onConnected()? 【发布时间】:2020-09-16 15:10:20 【问题描述】:

我刚开始自学 android 音频开发,我很困惑为什么这里既没有调用 connectionCallback 的 onConnected 方法也没有调用 onConnectionFailed 方法。 PodcastService 被实例化并调用了它的 onGetRoot 方法,但是没有调用回调。没有给出错误信息;根本没有调用回调。任何帮助都会很棒!

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()
    

播客服务.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】:

抱歉,我的研究做得不够好!

UAMP 演示项目中的一条评论指出:“为了调用 MediaBrowserCompat.ConnectionCallback.onConnected,需要在 MediaBrowserServiceCompat 上设置 MediaSessionCompat.Token。”

所以这就是缺少的东西!

【讨论】:

以上是关于为啥连接到 mediaBrowser 时没有调用 connectionCallback.onConnected()?的主要内容,如果未能解决你的问题,请参考以下文章

为啥其他东西通过 Interface Builder xib 调用连接到 UIBarButtonItem 的方法?

为啥 TIdIRC 不能连接到频道?有没有更好的组件?

为啥客户端没有连接到我的 tcp 服务器?

为啥我的 android 设备无法连接到 charles 代理,但在我连接到 Fiddler 代理时可以工作?

QTP+VM:为啥当我没有通过远程桌面连接到虚拟机时,点击命令没有执行?

为啥从 powershell 命令行连接到 github 时出错?