Android 一体机研发之修改系统设置————声音

news2024/9/21 16:35:00

在这里插入图片描述
Android 一体机研发之修改系统设置————屏幕亮度

Android 一体机研发之修改系统设置————声音

Android 一体机研发之修改系统设置————自动锁屏

修改系统设置系列篇章马上开张了! 本章将为大家细节讲解声音。

对于声音功能大家都不陌生,在多媒体时代,它是很必要的,同样也是缺它不可的版块;而在一体机实际应用中,这里更改的是媒体音量

声音

几个常见的 “音量类型”: STREAM_VOICE_CALL 通话STREAM_SYSTEM 系统STREAM_RING 铃声STREAM_MUSIC 媒体音量STREAM_ALARM 闹钟STREAM_NOTIFICATION 通知

设计思路

  1. 获取音频管理器
  2. 获取媒体音量最大值
  3. 获取系统当前媒体音量
  4. 通过seekBar设置系统媒体音量

具体实现

获取音频管理器
  • Java
 AudioManager mAudioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
  • Kotlin
mAudioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager

获取媒体音量最大值
  • Java
mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
  • Kotlin
mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)

获取系统当前媒体音量
  • Java
/**
 * 获取系统媒体音量
 * STREAM_VOICE_CALL 通话
 * STREAM_SYSTEM 系统
 * STREAM_RING 铃声
 * STREAM_MUSIC 媒体音量
 * STREAM_ALARM 闹钟
 * STREAM_NOTIFICATION 通知
 */
mCurrentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
  • Kotlin
mCurrentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)

设置系统媒体音量

  • Java
	voiceBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                Log.e("进度显示 >>>", "onProgressChanged: " + progress);
                //设置系统媒体音量
                setStreamVolume(progress);
            }

            
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

	/**
     * 设置系统媒体音量
     * setStreamVolume 直接设置音量
     * adjustStreamVolume 步长式设置音量,即10,20,30这样阶梯式
     * <p>
     * 参数1:音量类型
     * 参数2:音量数值
     * 参数3:
     * AudioManager.FLAG_SHOW_UI 调整音量时显示系统音量进度条 , 0 则不显示
     * AudioManager.FLAG_ALLOW_RINGER_MODES 是否铃声模式
     * AudioManager.FLAG_VIBRATE 是否震动模式
     * AudioManager.FLAG_SHOW_VIBRATE_HINT 震动提示
     * AudioManager.FLAG_SHOW_SILENT_HINT 静音提示
     * AudioManager.FLAG_PLAY_SOUND 调整音量时播放声音
     */
    private void setStreamVolume(int volume) {
        mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, AudioManager.FLAG_PLAY_SOUND);
    }
  • Kotlin
	seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                Log.i("onProgressChanged----", "" + progress)
                mCurrentVolume = progress
                //更新页面
                updateNum(mCurrentVolume)
                //设置媒体音量
                setStreamVolume(mCurrentVolume)
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {
            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {
            }
        })

	/**
     * 更新页面显示
     */
    private fun updateNum(volume: Int) {
        //tv_volume.text = volume.toString()
        seekBar.progress = volume
    }

    /**
     * 设置系统媒体音量
     */
    private fun setStreamVolume(volume: Int) {
        mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, AudioManager.FLAG_SHOW_UI)
    }

监听系统按键

	//监听系统按键
    
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_DOWN:
                if (mCurrentVolume > 0) {
                    mCurrentVolume--;
                } else {
                    mCurrentVolume = 0;
                }
                voiceBar.setProgress(mCurrentVolume);
                setStreamVolume(mCurrentVolume);
                Log.e("音量减 >>", "onKeyDown: " + mCurrentVolume );
                return true;
            case KeyEvent.KEYCODE_VOLUME_UP:
                if (mCurrentVolume < mMaxVolume) {
                    mCurrentVolume++;
                } else {
                    mCurrentVolume = mMaxVolume;
                }
                voiceBar.setProgress(mCurrentVolume);
                setStreamVolume(mCurrentVolume);
                Log.e("音量加 >>", "onKeyDown: " + mCurrentVolume );
                return true;
           /* case KeyEvent.KEYCODE_VOLUME_MUTE:

                return true;*/
        }
        return super.onKeyDown(keyCode, event);
    }

完整操作

  • Java
/**
 * @author 拉莫帅
 * @date 2023/2/8
 * @address
 * @Desc 修改系统声音(媒体声音)
 */
public class ChangeVoiceActivity extends AppCompatActivity {
  
    private AudioManager mAudioManager;
    private SeekBar voiceBar;

    //当前音量
    private int mCurrentVolume = 0;

    //最大音量
    private int mMaxVolume = 0;

    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chanage_voice);
        init();
    }

    private void init() {
        voiceBar = findViewById(R.id.voiceBar);
        ImageView back = findViewById(R.id.back);
        TextView title = findViewById(R.id.title);
        title.setText("声音");
        mAudioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);

        /**
         * 获取系统媒体音量
         * STREAM_VOICE_CALL 通话
         * STREAM_SYSTEM 系统
         * STREAM_RING 铃声
         * STREAM_MUSIC 媒体音量
         * STREAM_ALARM 闹钟
         * STREAM_NOTIFICATION 通知
         */
        mCurrentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        //获取媒体音量最大值
        mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        Log.e("进度 >>", "init: " + mCurrentVolume + "---" + mMaxVolume);
        voiceBar.setMax(mMaxVolume);
        //更新进度条
        voiceBar.setProgress(mCurrentVolume);

        back.setOnClickListener(new View.OnClickListener() {
            
            public void onClick(View v) {
                finish();
            }
        });

        voiceBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                Log.e("进度显示 >>>", "onProgressChanged: " + progress);
                setStreamVolume(progress);
            }

            
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }

    //监听系统按键
    
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_DOWN:
                if (mCurrentVolume > 0) {
                    mCurrentVolume--;
                } else {
                    mCurrentVolume = 0;
                }
                voiceBar.setProgress(mCurrentVolume);
                setStreamVolume(mCurrentVolume);
                Log.e("音量减 >>", "onKeyDown: " + mCurrentVolume );
                return true;
            case KeyEvent.KEYCODE_VOLUME_UP:
                if (mCurrentVolume < mMaxVolume) {
                    mCurrentVolume++;
                } else {
                    mCurrentVolume = mMaxVolume;
                }
                voiceBar.setProgress(mCurrentVolume);
                setStreamVolume(mCurrentVolume);
                Log.e("音量加 >>", "onKeyDown: " + mCurrentVolume );
                return true;
           /* case KeyEvent.KEYCODE_VOLUME_MUTE:

                return true;*/
        }
        return super.onKeyDown(keyCode, event);
    }

    /**
     * 设置系统媒体音量
     * setStreamVolume 直接设置音量
     * adjustStreamVolume 步长式设置音量,即10,20,30这样阶梯式
     * <p>
     * 参数1:音量类型
     * 参数2:音量数值
     * 参数3:
     * AudioManager.FLAG_SHOW_UI 调整音量时显示系统音量进度条 , 0 则不显示
     * AudioManager.FLAG_ALLOW_RINGER_MODES 是否铃声模式
     * AudioManager.FLAG_VIBRATE 是否震动模式
     * AudioManager.FLAG_SHOW_VIBRATE_HINT 震动提示
     * AudioManager.FLAG_SHOW_SILENT_HINT 静音提示
     * AudioManager.FLAG_PLAY_SOUND 调整音量时播放声音
     */
    private void setStreamVolume(int volume) {
        mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, AudioManager.FLAG_PLAY_SOUND);
    }
}
  • Kotlin
class VolumeActivity : AppCompatActivity() {

    //音频管理器
    private lateinit var mAudioManager: AudioManager

    //当前音量
    private var mCurrentVolume: Int = 0

    //最大音量
    private var mMaxVolume: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_volume)

        init()
        setListener()
    }

    ("SetTextI18n")
    private fun init() {
        mAudioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager

        /**
         * ringerMode 音量模式
         * RINGER_MODE_NORMAL 正常
         * RINGER_MODE_SILENT 静音
         * RINGER_MODE_VIBRATE 震动
         */
        when (mAudioManager.ringerMode) {
            AudioManager.RINGER_MODE_NORMAL -> tv_mode.text = "当前音量模式:正常"
            AudioManager.RINGER_MODE_SILENT -> tv_mode.text = "当前音量模式:静音"
            AudioManager.RINGER_MODE_VIBRATE -> tv_mode.text = "当前音量模式:震动"
        }

        /**
         * 获取系统媒体音量
         * STREAM_VOICE_CALL 通话
         * STREAM_SYSTEM 系统
         * STREAM_RING 铃声
         * STREAM_MUSIC 媒体音量
         * STREAM_ALARM 闹钟
         * STREAM_NOTIFICATION 通知
         */
        mCurrentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
        //获取媒体音量最大值
        mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)

        seekBar.max = mMaxVolume
        tv_max.text = "最大音量:$mMaxVolume"

        updateNum(mCurrentVolume)
    }

    private fun setListener() {

        btn_mode.setOnClickListener {
            mAudioManager.ringerMode = AudioManager.RINGER_MODE_NORMAL
            tv_mode.text = "当前音量模式:正常"
        }
        
        seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                Log.i("onProgressChanged----", "" + progress)
                mCurrentVolume = progress
                updateNum(mCurrentVolume)
                setStreamVolume(mCurrentVolume)
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {
            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {
            }
        })
    }

    /**
     * 更新页面显示
     */
    private fun updateNum(volume: Int) {
        tv_volume.text = volume.toString()
        seekBar.progress = volume
    }

    /**
     * 设置系统媒体音量
     * setStreamVolume 直接设置音量
     * adjustStreamVolume 步长式设置音量,即10,20,30这样阶梯式
     *
     * 参数1:音量类型
     * 参数2:音量数值
     * 参数3:
     *      AudioManager.FLAG_SHOW_UI 调整音量时显示系统音量进度条 , 0 则不显示
     *      AudioManager.FLAG_ALLOW_RINGER_MODES 是否铃声模式
     *      AudioManager.FLAG_VIBRATE 是否震动模式
     *      AudioManager.FLAG_SHOW_VIBRATE_HINT 震动提示
     *      AudioManager.FLAG_SHOW_SILENT_HINT 静音提示
     *      AudioManager.FLAG_PLAY_SOUND 调整音量时播放声音
     */
    private fun setStreamVolume(volume: Int) {
        mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, AudioManager.FLAG_SHOW_UI)
    }


最近忙里偷闲,↓↓↓↓【谁家de码农陈先生】↓↓↓↓,里面定时给大家分享技术博文、前方高能资讯内容!欢迎各位老板点赞关注,你们就是我的动力源泉!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/343427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java虚拟机(JVM)调优思路

title: Java虚拟机&#xff08;JVM&#xff09;调优思路 date: 2022-04-09 00:00:00 tags: JVM性能调优 categories:Java 调什么 内存方面 JVM需要的内存总大小各块内存分配&#xff0c;新生代、老年代、存活区选择合适的垃圾回收算法、控制GC停顿次数和时间解决内存泄露的问…

Appium移动自动化测试——app控件获取之uiautomatorviewer

下载手机YY http://yydl.duowan.com/mobile/yymobile_client-android/5.4.2/yymobile_client-5.4.2-881.apk 若链接失效&#xff0c;请自行百度 新建maven空白工程 前置条件&#xff1a;安装eclipse&#xff0c;及其maven插件&#xff0c;请自行百度 新建的工程如下&#xf…

Kylin查询下压的设置、Sparder查询引擎详细介绍、HDFS文件目录含义

目录1. 查询下压设置2. Sparder查询引擎详细介绍3. HDFS文件目录含义1. 查询下压设置 如果未开启查询下压&#xff0c;则查询有很多限制。这是因为只能查询cube中的数据&#xff0c;而不能通过spark sql查询Hive中的源数据 开启查询下压&#xff0c;优先从cube中查询数据&…

百度前端常考vue面试题(附答案)

怎么实现路由懒加载呢 这是一道应用题。当打包应用时&#xff0c;JavaScript 包会变得非常大&#xff0c;影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块&#xff0c;然后当路由被访问时才加载对应组件&#xff0c;这样就会更加高效 // 将 // import UserD…

因新硬件支持内核问题Ubuntu 22.04.2推迟发布

导读Ubuntu 22.04.2 LTS 原定于 2 月 9 日发布。但 Canonical 宣布该版本因各种问题不得不推迟两周&#xff0c;定于 2 月 23 日发布。 Ubuntu 22.04.2 LTS 原定于 2 月 9 日发布。但 Canonical 宣布该版本因各种问题不得不推迟两周&#xff0c;定于 2 月 23 日发布。 Canonica…

2023全网最火的接口自动化测试,一看就会

目录 接口自动化测试用例设计Excel接口测试用例访问MySQL接口测试用例访问PyTest测试框架接口自动化测试必备技能-HTTP协议request库实现接口请求 引言 与UI相比&#xff0c;接口一旦研发完成&#xff0c;通常变更或重构的频率和幅度相对较小。因此做接口自动化的性价比更高&…

AI是超越还是桎梏?从ChatGPT到5G+AI,我们在聊什么?

从家常里短聊到科技创新&#xff0c;从人文故事探讨到物理科学&#xff0c;诞生2个月用户即破亿的ChatGPT正成为火爆全球的AI应用工具&#xff0c;其强大的能力超乎人们想象。这款几乎博学多识的聊天机器人能运用AI系统进行简洁的交流&#xff0c;完成各种指令信息的表达。面对…

Prometheus 自动发现监控AWS EC2实例

本文章简述对接自动发现AWS云EC2实例 前提环境&#xff1a; PromethuesGrafanaAWS IAM权限 涉及参考文档&#xff1a; AWS EC2Grafana 通用监控模板 一、IAM 用户创建 1、创建Prometheus 策略 策略规则&#xff1a; {"Version": "2012-10-17",&quo…

【实际开发18】- 静态 3

目录 1. 调试与评估 2. 单元测试的管理 1. 单元测试的文档 3. 系统集成的模式与方法 1. 集成测试前的准备 2. 集成测试的模式 3. 大棒集成方法 ( Big-bang Integration) 4. 自顶向下和自底向上集成方法 1. 自顶向下法 ( Top-down Integration ) 2. 自底向上法 ( Bott…

linux如何查看编译器支持的C++版本(支持C++11、支持C++14、支持C++17、支持C++20)(编译时不指定g++版本,默认使用老版本编译)

文章目录C各个版本C11C14C17C20查看自己的编译器支持C哪个版本注意&#xff1a;编译时不指定g版本&#xff0c;默认使用老版本编译&#xff08;存疑&#xff09;C各个版本 C11 C11是一个重要的C标准版本&#xff0c;于2011年发布。C11带来了许多重要的改进&#xff0c;包括&a…

vue3封装数值动态递增组件

vue3封装数值动态递增组件前言源码举个例子&#xff1a;前言 1&#xff09;使用技术&#xff1a; vue3.2 Ts 2&#xff09;组件接收参数&#xff1a; 参数类型意义是否可选valuenumber数值大小必填durationnumber递增动画持续时间&#xff08;单位&#xff1a;s&#xff09;…

PyTorch学习笔记

PyTorch学习笔记&#xff08;一&#xff09;&#xff1a;PyTorch环境安装 往期学习资料推荐&#xff1a; 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 安装参考&#xff1a; 1.视频教程&#xff1a;3分钟深度学习【环境搭建】CUDA Anacon…

javascript测试二

一、 选择题&#xff08;共10题&#xff0c;每题2分&#xff09;1、在JavaScript中&#xff0c;想要一次跳出方法的多层循环结构需要用&#xff08;C &#xff09; A) breakB) continueC) returnD) false2、 下列关于嵌套循环以下说法正确的一项是(A )。A) 每一种循环结构内部也…

Elipse报错:Failed to load the JNI shared library jvm.dll解决方法

情景 导入Elipse的项目中有jar包和64位版本的JDK不兼容。 于是我安装了32位版本的JDK。 配置好系统环境后&#xff0c;重启Eclipse却遇到了这个问题。 原因 搜索后了解到&#xff0c;是因为Eclipse版本与JDK版本不匹配。 我的Eclipse是64位的&#xff0c;但JDK配置是32位的…

科技云报道:2023年,可观测性迎来哪些新趋势?

科技云报道原创。 可观测性不是一个新鲜的名词&#xff0c;但是近年来随着云原生技术的发展&#xff0c;在带来效率、可用性提升的同时也增加了复杂度&#xff0c;而可观测性成为降低这种复杂度的唯一手段&#xff0c;因此被推到了前所未有的重要地位。 Gartner将应用可观测…

前端面试常考 | 浅拷贝与深拷贝

文章目录一. 前言1. 概述2. 数据类型3. 存储区别二. 深浅拷贝1.深浅拷贝的定义2. 基本数据类型的拷贝3. 引用类型的拷贝4. 实现 “浅” 拷贝1. Object.assign()2. slice()3. concat()方法4. es6展开运算符5. 实现 “深” 拷贝1. JSON.parse(JSON.stringify(obj))2. lodash3. 递…

ASEMI代理FGH60N60,安森美FGH60N60车规级IGBT

编辑-Z 安森美FGH60N60车规级IGBT参数&#xff1a; 型号&#xff1a;FGH60N60 集电极到发射极电压&#xff08;VCES&#xff09;&#xff1a;600V 栅极到发射极电压&#xff08;VGES&#xff09;&#xff1a;20V 收集器电流&#xff08;IC&#xff09;&#xff1a;120A 二…

2023年1月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2023年1月国产数据库大事件和重要产品发布消息。 目录 1月国产数据库大事记&#xff08;时间线&#xff09;产品/版本发布兼容认证排行榜新增数据库厂商活动相关资料 1月国产数据库大事记&#xff08;时间线&#xff09; 1月6日消息&#xff0c;近日…

将小程序代码转成uni-app代码

最近因为公司项目原因需要将小程序的项目转换成uni—app的项目&#xff0c;所以总结了以下几点&#xff1a; 首先你可以先到uni-app的官网简单看一下对它的介绍&#xff0c;本次文章的介绍是针对简单的微信小程序来进行的转化。 在这之前我们来看一下目录对比 下面就来介绍一下…

Python绝对路径和相对路径详解

在介绍绝对路径和相对路径之前&#xff0c;先要了解一下什么是当前工作目录。什么是当前工作目录每个运行在计算机上的程序&#xff0c;都有一个“当前工作目录”&#xff08;或 cwd&#xff09;。所有没有从根文件夹开始的文件名或路径&#xff0c;都假定在当前工作目录下。注…