【问题标题】:Is there a way In Android to listen to Audio Volume Changes only?有没有办法在 Android 中只收听音频音量变化?
【发布时间】:2020-06-23 11:27:56
【问题描述】:

我见过一些类似问题的答案,主要是考虑将 ContentObserver 作为其解决方案。在类似下面的某处:

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

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

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

【问题讨论】:

  • SettingsContentObserver extends ContentObserver 完成这项工作。覆盖onChange方法。把int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)放在那里...希望有帮助
  • @GGK 是的,我已经实现了。但我的问题是“是否有一个我们可以注册 ContentObserver 的 URI,只监听音量变化?”这个问题的标题是:有没有办法在 Android 中只听音频音量变化? - only 是最重要的。
  • 我明白了,很抱歉造成误解。不知道有没有像上面提到的其他方法

标签: android volume android-contentresolver contentobserver


【解决方案1】:

我有一个适用于 API 16 或更高版本的解决方案。MediaRouter 可用于报告正在使用的媒体路由以及音量变化事件。

例子

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

您可以通过回调方法获取 VolumeChanged 事件 onRouteVolumeChanged(MediaRouter router, MediaRouter.RouteInfo info) 可以使用info.getVolume()检索卷的位置

【讨论】:

    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2011-01-12
    • 2012-03-20
    相关资源
    最近更新 更多