如何使用SeekBar准确地更改应用程序的音量,而不通过Android设备上的音量按钮控制音量?我在Android上有单独的音量键功能,因此我想使用SeekBar来控制音量。请问有人可以帮忙吗?
如何使用SeekBar准确地更改应用程序的音量,而不通过Android设备上的音量按钮控制音量?我在Android上有单独的音量键功能,因此我想使用SeekBar来控制音量。请问有人可以帮忙吗?
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class TestExample extends Activity
{
/** Called when the activity is first created. */
private SeekBar volumeSeekbar = null;
private AudioManager audioManager = null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
setContentView(R.layout.main);
initControls();
}
private void initControls()
{
try
{
volumeSeekbar = (SeekBar)findViewById(R.id.seekBar1);
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
volumeSeekbar.setMax(audioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
volumeSeekbar.setProgress(audioManager
.getStreamVolume(AudioManager.STREAM_MUSIC));
volumeSeekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
{
@Override
public void onStopTrackingTouch(SeekBar arg0)
{
}
@Override
public void onStartTrackingTouch(SeekBar arg0)
{
}
@Override
public void onProgressChanged(SeekBar arg0, int progress, boolean arg2)
{
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
progress, 0);
}
});
}
catch (Exception e)
{
e.printStackTrace();
}
}
SeekBar
重置为新值? - jul@CommonsWare在https://github.com/commonsguy/cw-omnibus/tree/master/SystemServices/Volume中采用以下方式进行操作,同时使用SeekBar设置五种音量类型。
处理五种不同类型的音量
/***
Copyright (c) 2008-2012 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.
From _The Busy Coder's Guide to Android Development_
http://commonsware.com/Android
*/
package com.commonsware.android.syssvc.volume;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
import android.widget.SeekBar;
public class Volumizer extends Activity {
SeekBar alarm=null;
SeekBar music=null;
SeekBar ring=null;
SeekBar system=null;
SeekBar voice=null;
AudioManager mgr=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mgr=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
alarm=(SeekBar)findViewById(R.id.alarm);
music=(SeekBar)findViewById(R.id.music);
ring=(SeekBar)findViewById(R.id.ring);
system=(SeekBar)findViewById(R.id.system);
voice=(SeekBar)findViewById(R.id.voice);
initBar(alarm, AudioManager.STREAM_ALARM);
initBar(music, AudioManager.STREAM_MUSIC);//for Volume this is neccessary
initBar(ring, AudioManager.STREAM_RING);
initBar(system, AudioManager.STREAM_SYSTEM);
initBar(voice, AudioManager.STREAM_VOICE_CALL);
}
private void initBar(SeekBar bar, final int stream) {
bar.setMax(mgr.getStreamMaxVolume(stream));
bar.setProgress(mgr.getStreamVolume(stream));
bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar bar, int progress,
boolean fromUser) {
mgr.setStreamVolume(stream, progress,
AudioManager.FLAG_PLAY_SOUND);
}
public void onStartTrackingTouch(SeekBar bar) {
// no-op
}
public void onStopTrackingTouch(SeekBar bar) {
// no-op
}
});
}
}
如果只想控制音量,请使用以下代码:
music=(SeekBar)findViewById(R.id.music);
和 initBar(music, AudioManager.STREAM_MUSIC);
View
。它通过向上滑动手指来工作,但您可以轻松更改它。
SliderView
public class SliderView extends View implements OnGestureListener, OnTouchListener {
private int mHeight = 0;
private int mMaxValue = 16;
private float mDelta = 0;
private int mColor = Color.WHITE;
private GestureDetector mGestureDetector;
private OnValueChangeListener mListener;
public SliderView(Context context) {
super(context);
init(context);
}
public SliderView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public SliderView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
@Override
public boolean onDown(MotionEvent e) {
mDelta = 0;
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
mDelta = 0;
}
@Override
public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) {
if (mDelta >= 1 || mDelta <= -1) {
if (mListener != null) {
mListener.onValueChanged((int) mDelta);
}
mDelta = 0;
} else {
mDelta += mMaxValue * distanceY / mHeight * 2;
}
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public void onSizeChanged(int w, int h, int oldw, int oldh) {
mHeight = getHeight();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
v.setBackgroundColor(Color.argb(0x33, Color.red(mColor), Color.green(mColor),
Color.blue(mColor)));
} else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
v.setBackgroundColor(Color.TRANSPARENT);
}
mGestureDetector.onTouchEvent(event);
return true;
}
public void setColor(int color) {
mColor = color;
}
public void setMax(int max) {
mMaxValue = max;
}
public void setOnValueChangeListener(OnValueChangeListener listener) {
mListener = listener;
}
private void init(Context context) {
setOnTouchListener(this);
mGestureDetector = new GestureDetector(context, this);
mHeight = getHeight();
}
public interface OnValueChangeListener {
void onValueChanged(int value);
}
}
使用它 - 确保您实现了OnValueChangeListener
。
SliderView mSlider;
mSlider= (SliderView) findViewById(id);
mSlider.setOnValueChangeListener(this);
mSlider.setMax(mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
虽然不完全符合您的要求,但我认为这一定会对您有所帮助。
private AudioManager audioManager;
private SeekBar seekBarSound;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekBarSound = findViewById(R.id.seekbar_sound);
try {
setVolumeControlStream(AudioManager.STREAM_MUSIC);
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
seekBarSound.setMax(audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
seekBarSound.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
seekBarSound.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
使用音量键同步:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP){
seekBarSound.setProgress((seekBarSound.getProgress()+1>seekBarSound.getMax())?seekBarSound.getMax():seekBarSound.getProgress()+1);
}else if (keyCode==KeyEvent.KEYCODE_VOLUME_DOWN){
seekBarSound.setProgress((seekBarSound.getProgress()-1<0)?0:seekBarSound.getProgress()-1);
}
return super.onKeyDown(keyCode, event);
}
我在初始化时遇到了音量设置为0的问题。
我通过使用以下代码解决了这个问题。
volumeManager.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
if(b){
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
带有百分比文本(100%)的音量拖动条
创建一个Java类并粘贴以下所有代码
public class Volume_Dialog extends AppCompatDialogFragment {
private ImageView cross;
private TextView volume_no;
private SeekBar seekBar;
AudioManager audioManager;
@SuppressLint("SetTextI18n")
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.volume_popup, null);
builder.setView(view);
getActivity().setVolumeControlStream(AudioManager.STREAM_MUSIC);
cross = view.findViewById(R.id.volume_cross);
volume_no = view.findViewById(R.id.volume_number);
seekBar = view.findViewById(R.id.volume_seekbar);
audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
seekBar.setMax(audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
seekBar.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
int mediavolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
int maxVol = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
double volPerc = Math.ceil((((double) mediavolume / (double) maxVol) * (double) 100));
volume_no.setText(volPerc+" %");
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
int mediavolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
int maxVol = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
double volPerc = Math.ceil((((double) mediavolume / (double) maxVol) * (double) 100));
volume_no.setText(volPerc+" %");
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
cross.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
return builder.create();
}}
现在在MainActivity中的任何onclick方法中调用这个Java类。就这样。
Volume_Dialog volume_dialog = new Volume_Dialog();
volume_dialog.show(getSupportFragmentManager(), "popup dialog");
我为你添加了一些清晰的注释,这样你就能理解每行代码的逻辑。祝你好运!
MediaPlayer mediaPlayer;
AudioManager audioManager;
//start the video when clicked.
public void pButton(View view){
mediaPlayer.start();
}
//pause the audio when clicked.
public void pause(View view){
mediaPlayer.pause();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//definning the audio manager as an audio service.
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
//setting an integer with the value of the max volume of every device.
int maxVolume= audioManager.getStreamMaxVolume(audioManager.STREAM_MUSIC);
//getting the current volume.
int currentVol = audioManager.getStreamVolume(audioManager.STREAM_MUSIC);
//setting the audio at the app setup so we wont nned to write this line in every method.
mediaPlayer = MediaPlayer.create(this,R.raw.allofme);
SeekBar volumeC = (SeekBar) findViewById(R.id.volSeekBar);
//setting the limit of the seek bar from its default 100 to the device max.
volumeC.setMax(maxVolume);
//setting the current value int to match with the seek bar.
volumeC.setProgress(currentVol);
//setting a listener to check the seekbar stats at all changes.
volumeC.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
Log.i("Seek Bar change:", Integer.toString(progress));
/*setting the audio manager to stream music with the value of the current integer
from the seek bar*/
audioManager.setStreamVolume(audioManager.STREAM_MUSIC ,progress ,0);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}