1

我遵循了关于连接 MediaBrowserCompat 的 Android 官方文档,但它被拒绝连接,事实上既没有onConnected()onConnectionSuspended()也没有onConnectionFailed()被调用。

我也试过这个答案,但没有奏效。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_audio_player);
        ButterKnife.bind(this);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        setupMediaComponents();


       // initializeViews();
    }

private void setupMediaComponents() {
        Log.d(TAG, "setupMediaComponents");
        setVolumeControlStream(AudioManager.STREAM_MUSIC);

        mediaBrowserCompat = new MediaBrowserCompat(this, new ComponentName(this, SongPlayerService.class),
                mediaBrowserCompatConnectionCallback, null);
    }

    @Override
    protected void onStart() {
        super.onStart();
        mediaBrowserCompat.connect();
    }

    @Override
    public void onStop() {
        super.onStop();
        // (see "stay in sync with the MediaSession")
        if (MediaControllerCompat.getMediaController(this) != null) {


    MediaControllerCompat.getMediaController(this).unregisterCallback(controllerCallback);
            }
            mediaBrowserCompat.disconnect();

        }

private MediaBrowserCompat.ConnectionCallback mediaBrowserCompatConnectionCallback = new MediaBrowserCompat.ConnectionCallback() {
        @Override
        public void onConnected() {
            Log.d(TAG, "onConnected");
            try {
                // Create a MediaControllerCompat
                MediaControllerCompat mediaController =
                        new MediaControllerCompat(AudioPlayerActivity.this,  mediaBrowserCompat.getSessionToken());

                // Save the controller
                MediaControllerCompat.setMediaController(AudioPlayerActivity.this, mediaController);

                setControlClickListeners();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onConnectionSuspended() {
            Log.d(TAG, "onConnectionSuspended");
            // We were connected, but no longer :-(
        }

        @Override
        public void onConnectionFailed() {
            Log.d(TAG, "onConnectionFailed");
            // The attempt to connect failed completely.
            // Check the ComponentName!
        }
    };

我正在使用25.3.1支持库的版本,并且所有 sdk 工具都是最新的。


编辑

SongPlayerService 的一部分

@Nullable
    @Override
    public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid, @Nullable Bundle rootHints) {
        // Returning null means no one can connect so we’ll return something
        return new BrowserRoot(getString(R.string.app_name), null); // Name visible in Android auto, Bundle is for optional params
        // TODO: Support Android auto
    }
4

3 回答 3

6

终于找到了问题的根源。我正在压倒一切onBind并返回null

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

删除上述行为我修复了它。

于 2017-04-28T09:36:57.863 回答
3

您必须实现 MediaBrowserServiceCompat 的两个方法。至少:

@Nullable
@Override
public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid, @Nullable Bundle rootHints) {
    return new BrowserRoot(MEDIA_ID_ROOT, null);
}

@Override
public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result) {
    result.sendResult(null);
}
于 2017-11-04T02:52:40.657 回答
1

onConnectionFailed()如果您未能在AndroidManifest文件中声明服务,也可以调用。确保意图过滤器也是正确的。资源

<service
          android:name=".media.MusicService"
          android:enabled="true"
          android:exported="true"
          tools:ignore="ExportedService">

            <intent-filter>
                <action android:name="android.media.browse.MediaBrowserService" />
            </intent-filter>
 </service>
于 2020-01-09T11:35:32.230 回答