在 Android 中有没有办法只听音频音量变化?

Is there a way In Android to listen to Audio Volume Changes only?

我看到了一些类似问题的答案,其中大部分都将 ContentObserver 作为其解决方案。某处类似于以下内容:

getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, new ContentObserver(){...} );

但是为 CONTENT_URI 注册的 Content Observer 也会观察许多其他变化。虽然,我们可以通过检查前一个音量和当前音量之间的差异来检测它是否是一个音量变化,这似乎也很昂贵,因为我们需要一个操作来获取当前音量和一个变量来存储我希望避免的前一个音量.

那么,有没有一种方法我们可以只监听音频音量变化?

我得到了一个在 API16 或更高版本上工作的解决方案。MediaRouter 可以使用它报告正在使用的媒体路由以及音量更改事件。

Example

mediaRouter = (MediaRouter) owner.getContext().getSystemService(MEDIA_ROUTER_SERVICE);
setupCallback();
mediaRouter.addCallback(ROUTE_TYPE_USER, callback, CALLBACK_FLAG_UNFILTERED_EVENTS);

其中 setupCallback() 如下:

private void setupCallback() {
    callback = new MediaRouter.Callback() {

        @Override
        public void onRouteSelected(MediaRouter router, int type, MediaRouter.RouteInfo info) {
        }

        @Override
        public void onRouteUnselected(MediaRouter router, int type, MediaRouter.RouteInfo info) {
        }

        @Override
        public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) {
        }

        @Override
        public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo info) {
        }

        @Override
        public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo info) {
        }

        @Override
        public void onRouteGrouped(MediaRouter router, MediaRouter.RouteInfo info, MediaRouter.RouteGroup group, int index) {
        }

        @Override
        public void onRouteUngrouped(MediaRouter router, MediaRouter.RouteInfo info, MediaRouter.RouteGroup group) {
        }

        @Override
        public void onRouteVolumeChanged(MediaRouter router, MediaRouter.RouteInfo info) {
            Log.d("onRouteVolumeChanged", info.getVolume());
        }
    };
}

You can get the VolumeChanged event with a callback method onRouteVolumeChanged(MediaRouter router, MediaRouter.RouteInfo info) where the volume can be retrieved using info.getVolume()