代码之家  ›  专栏  ›  技术社区  ›  exequielc

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

  •  1
  • exequielc  · 技术社区  · 8 年前

    同时降低流音量和增加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中。

    1 回复  |  直到 6 年前
        1
  •  3
  •   brandall    8 年前

    你想做的是 '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();
                }
            }
        }
    

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

    呼叫 duckAudioMedia 当TTS启动时 abandonAudioMedia 当话语完整时。