使用SeekBar来控制在Android的音量?

我怎样才能准确地改变我的应用程序的音量使用seekbar,而不是通过我的android设备上的音量button控制音量? 我有我的Android上的音量键上的分离function,这就是为什么我想用一个search栏来控制音量。 谁能帮帮我吗?

Solutions Collecting From Web of "使用SeekBar来控制在Android的音量?"

请看下面的代码。 它解决了你的问题。

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(); } } 

这是我用来调整音量的自定义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)); 

这不完全是你要求的,但我认为它肯定会帮助你。

@CommonsWarehttps://github.com/commonsguy/cw-omnibus/tree/master/SystemServices/Volume中这样做,并使用SeekBar设置五种types的音&#x91CF;

处理五种不同types的音量

 /*** 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);