在 Android Audiomanager 中调整音量不准确
Adjusting Volume in Android Audiomanager is inaccurate
在我的 Android 应用程序中,我有一个方法可以让我调整音量。这就像它应该的那样工作。
public void adjustVolume(int adjustType){
if(myAudioManager == null) {
myAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
}
if (adjustType == 0){
myAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
Toast.makeText(getApplicationContext(), "mute audio", Toast.LENGTH_SHORT).show();
}
else if(adjustType == 1) {
myAudioManager.adjustVolume(AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
Toast.makeText(getApplicationContext(), "decrease volume", Toast.LENGTH_SHORT).show();
}
else if (adjustType == 2){
myAudioManager.adjustVolume(AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
Toast.makeText(getApplicationContext(), "increase volume", Toast.LENGTH_SHORT).show();
}
else if (adjustType == 3){
int maxVolume = myAudioManager.getStreamMaxVolume(AudioManager.STREAM_SYSTEM);
myAudioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, maxVolume, AudioManager.FLAG_SHOW_UI);
Toast.makeText(getApplicationContext(), "Max volume", Toast.LENGTH_SHORT).show();
}
Log.d(LOG_TAG, "Volume is " + myAudioManager.getStreamVolume(AudioManager.STREAM_SYSTEM));
}
例如我可以调用 adjustVolume(1)
减小音量,调用 adjustVolume(2)
增大音量。从零音量到最大音量需要 15 步
到目前为止,还不错。
现在我有另一种方法,我想直接设置音量:
public void adjustVolumeDirect(int volumeValue) {
if(myAudioManager == null) {
myAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
}
//maxVolume is 7
int maxVolume = myAudioManager.getStreamMaxVolume(AudioManager.STREAM_SYSTEM);
float factor = (float)volumeValue / 100;
int targetVolume = (int) (maxVolume * factor);
Log.d(LOG_TAG,"MAX_VOLUME = "+maxVolume+" VOLUMEVALUE = " +volumeValue+ " TARGET VOLUME = " + targetVolume + "factor = " + factor);
myAudioManager.setStreamVolume(AudioManager.STREAM_SYSTEM,targetVolume , AudioManager.FLAG_SHOW_UI);
}
例如
adjustVolumeDirect(100)
应将音量设置为最大。 adjustVolumeDirect(50)
应该设置为 50% 等等。
这部分并不像我预期的那样工作。我只能设置音量 7 步! 上面的方法给了我 15 步!
谁能告诉我如何解决这个问题?
我想分 10 步设置音量:
adjustVolumeDirect(10) = 10%
adjustVolumeDirect(20) = 20%
...
adjustVolumeDirect(100) = 100%
我怎样才能做到这一点?
您的步骤数不同的原因可能是因为两个不同的音频流受到影响 - 例如系统音频流可能有 7 个步骤,而媒体音频流可能有 15 个。
步数因不同android设备而异,由系统定义。另见 this issue in the android bug tracker.
根据您的设备,可以通过不同的方式进行更精细的调整。您或许可以找到更多信息 here on the android stackexchange site.
我已经解决了这个问题:
mAudioManager.getStreamMaxVolume(audio.STREAM_MUSIC)**/3**
mAudioManager.getStreamMaxVolume(audio.STREAM_MUSIC)**/2**
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audio.getStreamMaxVolume(mAudioManager.STREAM_MUSIC)/3, AudioManager.FLAG_SHOW_UI);
在我的 Android 应用程序中,我有一个方法可以让我调整音量。这就像它应该的那样工作。
public void adjustVolume(int adjustType){
if(myAudioManager == null) {
myAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
}
if (adjustType == 0){
myAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
Toast.makeText(getApplicationContext(), "mute audio", Toast.LENGTH_SHORT).show();
}
else if(adjustType == 1) {
myAudioManager.adjustVolume(AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
Toast.makeText(getApplicationContext(), "decrease volume", Toast.LENGTH_SHORT).show();
}
else if (adjustType == 2){
myAudioManager.adjustVolume(AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
Toast.makeText(getApplicationContext(), "increase volume", Toast.LENGTH_SHORT).show();
}
else if (adjustType == 3){
int maxVolume = myAudioManager.getStreamMaxVolume(AudioManager.STREAM_SYSTEM);
myAudioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, maxVolume, AudioManager.FLAG_SHOW_UI);
Toast.makeText(getApplicationContext(), "Max volume", Toast.LENGTH_SHORT).show();
}
Log.d(LOG_TAG, "Volume is " + myAudioManager.getStreamVolume(AudioManager.STREAM_SYSTEM));
}
例如我可以调用 adjustVolume(1)
减小音量,调用 adjustVolume(2)
增大音量。从零音量到最大音量需要 15 步
到目前为止,还不错。
现在我有另一种方法,我想直接设置音量:
public void adjustVolumeDirect(int volumeValue) {
if(myAudioManager == null) {
myAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
}
//maxVolume is 7
int maxVolume = myAudioManager.getStreamMaxVolume(AudioManager.STREAM_SYSTEM);
float factor = (float)volumeValue / 100;
int targetVolume = (int) (maxVolume * factor);
Log.d(LOG_TAG,"MAX_VOLUME = "+maxVolume+" VOLUMEVALUE = " +volumeValue+ " TARGET VOLUME = " + targetVolume + "factor = " + factor);
myAudioManager.setStreamVolume(AudioManager.STREAM_SYSTEM,targetVolume , AudioManager.FLAG_SHOW_UI);
}
例如
adjustVolumeDirect(100)
应将音量设置为最大。 adjustVolumeDirect(50)
应该设置为 50% 等等。
这部分并不像我预期的那样工作。我只能设置音量 7 步! 上面的方法给了我 15 步!
谁能告诉我如何解决这个问题? 我想分 10 步设置音量:
adjustVolumeDirect(10) = 10%
adjustVolumeDirect(20) = 20%
...
adjustVolumeDirect(100) = 100%
我怎样才能做到这一点?
您的步骤数不同的原因可能是因为两个不同的音频流受到影响 - 例如系统音频流可能有 7 个步骤,而媒体音频流可能有 15 个。
步数因不同android设备而异,由系统定义。另见 this issue in the android bug tracker.
根据您的设备,可以通过不同的方式进行更精细的调整。您或许可以找到更多信息 here on the android stackexchange site.
我已经解决了这个问题:
mAudioManager.getStreamMaxVolume(audio.STREAM_MUSIC)**/3**
mAudioManager.getStreamMaxVolume(audio.STREAM_MUSIC)**/2**
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audio.getStreamMaxVolume(mAudioManager.STREAM_MUSIC)/3, AudioManager.FLAG_SHOW_UI);