在 android 中使用 SeekBar 控制音量?

     2023-04-14     235

关键词:

【中文标题】在 android 中使用 SeekBar 控制音量?【英文标题】:Using SeekBar to Control Volume in android? 【发布时间】:2012-04-25 10:25:32 【问题描述】:

如何在不通过 Android 设备上的音量按钮控制音量的情况下使用搜索栏准确更改应用的音量?我在我的 android 上的音量键上有单独的功能,这就是为什么我想使用搜索栏来控制音量。谁能帮帮我?

【问题讨论】:

***.com/questions/11095576/… 【参考方案1】:

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

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

【讨论】:

Eclipse 告诉我删除 @Override 注释。我这样做后它不起作用。请帮忙 这很可能是因为您在 Java 1.5 和 Java 1.6 之间切换。在 1.5 中,您无法使用 @Override 标记接口实现,但在 1.6 中可以。 我试图让我的活动实现 OnSeekBarChangeListener 并重新实现这些方法,但应用程序在以下几行崩溃:volumeSeekbar.setMax(audioManager .getStreamMaxVolume(AudioManager.STREAM_MUSIC)); volumeSeekbar.setProgress(audioManager .getStreamVolume(AudioManager.STREAM_MUSIC)); 当用户使用设备音量控制修改音量时,是否有监听器将SeekBar重置为新值? 我听不到android中音量变化的声音【参考方案2】:

这是我用来调节音量的自定义View。它通过向上滑动手指来工作,但您可以轻松更改它。

滑块视图

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

这并不完全符合您的要求,但我认为它肯定会帮助您。

【讨论】:

【参考方案3】:

@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);

【讨论】:

【参考方案4】:
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);

【讨论】:

【参考方案5】:

我为你添加了一些清晰的注释,这样你就会明白每一行的逻辑祝你好运!

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) 

        
    );


【讨论】:

【参考方案6】:

我在初始化时遇到音量设置为 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) 

            
        );

【讨论】:

【参考方案7】:

带有更改百分比文本的音量搜索栏(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();

现在在任何 onclick 方法中调用 MainActivity 中的这个 java 类。就是这样

Volume_Dialog volume_dialog = new Volume_Dialog();
                volume_dialog.show(getSupportFragmentManager(), "popup dialog");

【讨论】:

apk修改成短滑动条

1、首先打开AndroidStudio,打开项目,找到需要修改的布局文件;2、在布局文件中查找SeekBar控件,修改它的android:layout_width属性值为“wrap_content”;3、在SeekBar控件中添加android:thumb属性,并设置为一个小图片;4、在SeekBar控件中添... 查看详情

seekbar(拖动条)

本节引言:本节我们继续来学习Android的基本UI控件中的拖动条——SeekBar,相信大家对他并不陌生,最常见的地方就是音乐播放器或者视频播放器了,音量控制或者播放进度控制,都用到了这个SeekBar,我们先来看看SeekBar的类结构... 查看详情

如何在 api 17 或更高版本中使 android seekbar 全宽?

】如何在api17或更高版本中使androidseekbar全宽?【英文标题】:howtomakeandroidseekbarfullwidthinapi17orabove?【发布时间】:2016-01-2411:02:42【问题描述】:我想让搜索栏全宽,没有填充。我看过这个答案HowtomakeSeekBartakeupfullwidthofparent但在api... 查看详情

android开发中如何设置seekbar的最小值?

设置拖动条SeekBar的拖动范围,如70-100之间。SeekBar是ProgressBar的扩展,在其基础上增加了一个可拖动的thumb(注:就是那个可拖动的图标)。用户可以触摸thumb并向左或向右拖动,再或者可以使用方向键都可以设置当前的进度等级。... 查看详情

在android中播放音轨中的音频

】在android中播放音轨中的音频【英文标题】:playingaudiofromaudiotrackinandroid【发布时间】:2011-01-1622:53:06【问题描述】:我想通过在线mp3链接播放音乐。我正在将音乐数据读入流中并尝试使用音轨播放它。但它只会发出噪音。我听... 查看详情

在 Android 中实现一个滑块(SeekBar)

】在Android中实现一个滑块(SeekBar)【英文标题】:Implementingaslider(SeekBar)inAndroid【发布时间】:2012-01-2714:37:16【问题描述】:我想实现一个滑块,它基本上是两条线,一条垂直,一条水平,穿过屏幕被触摸的地方。我已经成功制... 查看详情

Android在音频播放器中刷新Seekbar进度和播放持续时间导致音频播放滞后

】Android在音频播放器中刷新Seekbar进度和播放持续时间导致音频播放滞后【英文标题】:AndroidrefreshingSeekbarprogressandplaybackdurationinaudioplayercausinglagsinaudioplayback【发布时间】:2017-02-1017:18:11【问题描述】:我正在制作一个音频播放... 查看详情

android入门第18天-android里的seekbar的使用(代码片段)

...来调节音量、模糊阀值等场景。SeekBar里怎么是通过:android:layout_weight="1"这个值设置大小的。其它我们都使用默认的就行。我们先来看UI界面的代码吧。activity_main.xml<?xmlversion=" 查看详情

一个简单seekbar样式的例子(代码片段)

SeekBar在布局中的使用: <SeekBarandroid:layout_width="300px"android:layout_height="wrap_content"android:minHeight="10px"<!--定义进度条的高,不包括thumb的高-->android:maxHeight="10px"<!--定义进度条的高,不包括thumb的高 查看详情

android6.0源码修改之settings音量调节界面增加通话音量调节(代码片段)

前言今天客户提了个需求,因为我们的设备在正常情况下无法调节通话音量,只有在打电话过程中,按物理音量加减键才能出现调节通话音量seekBar,很不方便,于是乎需求就来了。需要优化两个地方1、在正常情况下,按物理音... 查看详情

seekbar的使用

1.需求:需要改变其默认颜色,样式2.滑竿样式seekbar.xml<?xmlversion="1.0"encoding="utf-8"?><layer-listxmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@android:id/background"andro 查看详情

Seekbar 控制 Soundpool,停止工作

】Seekbar控制Soundpool,停止工作【英文标题】:SeekbarControllingSoundpool,stopsworking【发布时间】:2017-04-2714:20:53【问题描述】:所以我有8张图片,每张图片都会启动8种不同声音的循环。我在每个图像下都有一个搜索栏来控制该声音... 查看详情

android开发如何更改seekbar式样

情况是这样的:使用ADT(eclipse)进行Android开发,当我新建一个Android工程时,会同时生成一个appcompat_v7工程文件,然后看到工程中的控件式样如图一,主要是进度条SeekBar的式样是Android4.0的式样。如果不是新建一个新工程而是打开... 查看详情

android使用滑动条seekbar(代码片段)

layout布局文件(clear_activity.xml):SeekBar的属性值介绍:android:max=“255”(最大的滑动值,从0开始)android:progress=“255”(初始时滑动条的位置)<?xmlversion=& 查看详情

无法使用 Appium 移动 Android SeekBar

】无法使用Appium移动AndroidSeekBar【英文标题】:Can\'tmoveAndroidSeekBarwithAppium【发布时间】:2016-06-1809:48:47【问题描述】:我有一个像这样定制的Android搜索栏,以及它可以移动到的位置。并且从中间开始:我想先移动滑块,然后检... 查看详情

android关于自定义seekbar控件的问题(将横向seekbar改成竖向seekbar)

...gress值发生改变?以下是我写的自定义seekbar的代码:importandroid.content.Context;importandroid.graphics.Canvas;importandroid.util.AttributeSet;importandroid.view.KeyEvent;importandroid.view.MotionEvent;importandroid.widget.SeekBar;publicclassVerticalSeekBarTwoextendsSeekBar publicV... 查看详情

如何使用 android seekbar 更改 chrome cast 设备音量

】如何使用androidseekbar更改chromecast设备音量【英文标题】:Howtochangechromecastdevicevolumeusingandroidseekbar【发布时间】:2017-03-0711:27:43【问题描述】:我想使用我的应用程序搜索栏更改chromecast设备音量。这是我的seekbar的onProgressChanged... 查看详情

seekbar在运行时更改指针位置

嗨,我是android新手,我想在用户滚动搜索栏指针时将搜索栏指针位置更改为某个自定义值。我的搜索栏位置是1,2,3,4,5,7,10,15,20,30,60,最后一个最大值是100。答案我想这有你需要的https://android-arsenal.com/details/1/5954您可以查看有关如... 查看详情