请求音频焦点的正确参数是什么?

7

我是一位对Android和Java不太熟悉的新手。我一直在使用Android开发者和其他网站提供的MediaPlayer和AudioManager示例。

我注意到,在调用requestAudioFocus()时似乎有两个不同的签名被使用。 例如,从http://developer.android.com/guide/topics/media/mediaplayer.html这个网站上可以看到:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
    AudioManager.AUDIOFOCUS_GAIN);

if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    // could not get audio focus.
}

以下是文本翻译:

"requestAudioFocus() 的第一个参数是 AudioManager.OnAudioFocusChangeListener 接口,它的 onAudioFocusChange() 方法在音频焦点改变时被调用。因此,您还应该在服务和活动中实现此接口。例如:" (代码如下)

class MyService extends Service
                implements AudioManager.OnAudioFocusChangeListener {
    // ....
    public void onAudioFocusChange(int focusChange) {
        // Do something based on focus change...
    }
}

从以下网站获取信息: http://developer.android.com/training/managing-audio/audio-focus.html 其中包括:

OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
    public void onAudioFocusChange(int focusChange) {
        if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT) {
            // Pause playback
        } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
            // Resume playback 
        } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
            am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
            am.abandonAudioFocus(afChangeListener);
            // Stop playback
        }
    }
};

AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
...

// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
                                 // Use the music stream.
                                 AudioManager.STREAM_MUSIC,
                                 // Request permanent focus.
                                 AudioManager.AUDIOFOCUS_GAIN);

if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    am.registerMediaButtonEventReceiver(RemoteControlReceiver);
    // Start playback.
}

我在许多涉及处理音频焦点变化的示例代码网站上看到了这种二分法。我的理解是,"this" 提供了应用当前状态的上下文环境。我不明白为什么有些情况下调用 requestAudioFocus() 方法时正确的参数是 "this" 而不是一个变化监听器的句柄。
实际上,我提供的第一个示例说明了第一个参数应该是 AudioManager.OnAudioFocusChangeListener,但却使用了 "this"。
如果您能解释一下为什么使用 "this" 而不是 AudioManager.OnAudioFocusChangeListener 作为参数,那将非常感激。
1个回答

6

总是需要一个 onAudioFocusedChangeListener。如果传递此参数,则当前类实现 onAudioFocusChangeListener 接口。


谢谢。这是不是意味着使用“this”是不正确的? - JimCzek
1
不,如果您的类使用“this”实现了onAudioFocusChangedListener接口,则完全有效。这是相当常见的做法。 - Gabe Sechan
请忽略我的后续问题。我明白你的意思了。再次感谢。 - JimCzek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接