我想知道如何从音量键控制我的应用程序的音量(与我的信念相反,我读过他们只控制铃声音量)。我应该覆盖onKey Down / Up吗?
或者还有其他方法可以实现这一目标吗?我问,因为如果我覆盖一个活动的上面提到的函数,那么只有当与此活动相关联的视图具有焦点时,函数才会收到事件,并且我正在寻找“Globaly”的东西(不工作)无论现在正在运行什么活动)
答案 0 :(得分:73)
还有另一个question from a long time ago提出同样的问题。基本上答案是:不要覆盖onKeyDown和onKeyUp按钮。在onCreate()方法中简单地使用这一行setVolumeControlStream(AudioManager.STREAM_MUSIC);
会好得多。这告诉操作系统,当您的应用程序可见时,音量按钮应该影响“媒体”音量,这就是它为您的应用程序使用的音量。
至于控制媒体音量,无论哪个应用程序可见,我都不确定是否可以 - 或者是否可以,这是否是一件好事。
答案 1 :(得分:11)
在您的活动中,您可以使用以下其中一项:
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
this.setVolumeControlStream(AudioManager.STREAM_RING);
this.setVolumeControlStream(AudioManager.STREAM_ALARM);
this.setVolumeControlStream(AudioManager.STREAM_NOTIFICATION);
this.setVolumeControlStream(AudioManager.STREAM_SYSTEM);
this.setVolumeControlStream(AudioManager.STREAM_VOICECALL);
答案 2 :(得分:1)
希望这个有效的Android代码可以帮助您开发自己的音量控制应用程序:
public class audioSetting extends Activity {
Button b;
TextView t;
SeekBar s;
EditText e;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b = (Button)findViewById(R.id.button1);
s = (SeekBar)findViewById(R.id.seekBar1);
e = (EditText)findViewById(R.id.editText1);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
finish();
}
});
final AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
int a = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
int c = audioManager.getStreamVolume(AudioManager.STREAM_RING);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
audioManager.setStreamVolume(AudioManager.STREAM_RING, (int)(Integer.parseInt(e.getText().toString().trim())), 0);
s.setProgress((int)(Integer.parseInt(e.getText().toString().trim())));
}
});
s.setMax(a);
s.setProgress(c);
e.setText(""+c);
s.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
audioManager.setStreamVolume(AudioManager.STREAM_RING, arg1, 0);
e.setText(""+s.getProgress());
}
});
}
}
答案 3 :(得分:0)
这是一个老问题,但是有一个很棒的库来处理android中的音量控制(甚至比音量按钮更好,音量按钮限制为音量级别的5个增量)。
http://code.google.com/p/media-volume-control
看看this package,它提供连续的音量级别以及其他不错的功能(例如音频中断时,如果/当音量级别通过任何方式改变时,将通知音量监视器 - 在显示卷SeekBar等时要小心。)。