java - 您如何在 Android 中获取/设置媒体音量 (spotify) 和 TTS?

标签 java android text-to-speech volume audio

同时降低流音量和增加TTS音量

我有这个 Android 应用程序,它每次都与 TTS 通话并使用流媒体音乐 (spotify)。所以,我需要降低音量并提高 TTS

我使用此代码,但这也会降低 tts。

AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,[int value],[if desired a flag]);

任何减少像流音乐一样的 spotify 的方法。

在 Java/android 中。

最佳答案

你想做的是 'audio ducking'

下面是一些示例代码:

   /**
     * Our {@link AudioManager.OnAudioFocusChangeListener}
     */
    private static AudioManager.OnAudioFocusChangeListener audioFocus = new AudioManager.OnAudioFocusChangeListener() {

        @Override
        public void onAudioFocusChange(final int focusChange) {
            if (DEBUG) {
                MyLog.i(CLS_NAME, "AudioManager focusChange: " + focusChange);
            }

            switch (focusChange) {

                case AudioManager.AUDIOFOCUS_GAIN:
                    if (DEBUG) {
                        MyLog.i(CLS_NAME, "AudioManager focusChange: AUDIOFOCUS_GAIN");
                    }
                    break;
                case AudioManager.AUDIOFOCUS_LOSS:
                    if (DEBUG) {
                        MyLog.i(CLS_NAME, "AudioManager focusChange: AUDIOFOCUS_LOSS");
                    }
                    break;
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                    if (DEBUG) {
                        MyLog.i(CLS_NAME, "AudioManager focusChange: AUDIOFOCUS_LOSS_TRANSIENT");
                    }
                    break;
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                    if (DEBUG) {
                        MyLog.i(CLS_NAME, "AudioManager focusChange: AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");
                    }
                    break;
                default:
                    if (DEBUG) {
                        MyLog.i(CLS_NAME, "AudioManager focusChange: AUDIOFOCUS default");
                    }
                    break;
            }
        }
    };

    /**
     * Duck the audio
     *
     * @param ctx the application context
     */
    public static void duckAudioMedia(final Context ctx) {
        if (DEBUG) {
            MyLog.i(CLS_NAME, "duckAudioMedia");
        }

        try {

            final AudioManager audioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);

            switch (audioManager.requestAudioFocus(audioFocus, AudioManager.STREAM_MUSIC,
                    AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK)) {

                case AudioManager.AUDIOFOCUS_REQUEST_FAILED:
                    if (DEBUG) {
                        MyLog.w(CLS_NAME, "AudioManager duckAudioMedia AUDIOFOCUS_REQUEST_FAILED");
                    }
                    break;
                case AudioManager.AUDIOFOCUS_REQUEST_GRANTED:
                    if (DEBUG) {
                        MyLog.i(CLS_NAME, "AudioManager duckAudioMedia AUDIOFOCUS_REQUEST_GRANTED");
                    }
                    break;
                default:
                    if (DEBUG) {
                        MyLog.i(CLS_NAME, "AudioManager duckAudioMedia AUDIOFOCUS default");
                    }
                    break;
            }
        } catch (final NullPointerException e) {
            if (DEBUG) {
                MyLog.w(CLS_NAME, "duckAudioMedia: NullPointerException");
                e.printStackTrace();
            }
        } catch (final Exception e) {
            if (DEBUG) {
                MyLog.w(CLS_NAME, "duckAudioMedia: Exception");
                e.printStackTrace();
            }
        }
    }

   /**
     * Notify the System that any previous condition requiring to duck or pause audio is now complete.
     *
     * @param ctx the application context
     */
    public static void abandonAudioMedia(final Context ctx) {
        if (DEBUG) {
            MyLog.i(CLS_NAME, "abandonAudioMedia");
        }

        try {

            final AudioManager audioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);

            switch (audioManager.abandonAudioFocus(audioFocus)) {

                case AudioManager.AUDIOFOCUS_REQUEST_FAILED:
                    if (DEBUG) {
                        MyLog.w(CLS_NAME, "AudioManager abandonAudioMedia AUDIOFOCUS_REQUEST_FAILED");
                    }
                    break;
                case AudioManager.AUDIOFOCUS_REQUEST_GRANTED:
                    if (DEBUG) {
                        MyLog.i(CLS_NAME, "AudioManager abandonAudioMedia AUDIOFOCUS_REQUEST_GRANTED");
                    }
                    break;
                default:
                    if (DEBUG) {
                        MyLog.i(CLS_NAME, "AudioManager abandonAudioMedia AUDIOFOCUS default");
                    }
                    break;
            }
        } catch (final NullPointerException e) {
            if (DEBUG) {
                MyLog.w(CLS_NAME, "abandonAudioMedia: NullPointerException");
                e.printStackTrace();
            }
        } catch (final Exception e) {
            if (DEBUG) {
                MyLog.w(CLS_NAME, "abandonAudioMedia: Exception");
                e.printStackTrace();
            }
        }
    }

您必须删除我的自定义日志记录。

在 TTS 开始时调用 duckAudioMedia,在语音完成时调用 abandonAudioMedia

关于java - 您如何在 Android 中获取/设置媒体音量 (spotify) 和 TTS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36897807/

相关文章:

java - 使用 aChart Engine 使条形图的条形可点击

java - Android默认白色背景十六进制代码

Android:如果应用程序被卸载/降级,则不会删除应用程序私有(private)文件夹

android - Google Play 上的沙盒模式?

javascript - 如何编写信号量检查两种不同的状态

android - Cordova 文字转语音

java - Jetty Maven 插件重新加载忽略 web.xml 监听器

java - 每 3 秒更新一次 TextView 值

android - 有什么方法可以在 Android 中打开 .doc 文件?

android - 如何为 Android 2.3 创建 TTS 引擎?