Android 使用 ToneGenerator 实现按键提示音

Android 使用 ToneGenerator 实现按键提示音

  • 外部链接
  • 简单效果
  • 功能简单实现
    • 工具类
    • 线程池工具
    • 主页面简单实现

外部链接

DTMF原理
处理音频输出的变化
ToneGenerator API

简单效果

功能简单实现

工具类

package com.xg.practise.utilimport android.app.Activity
import android.content.Context
import android.media.AudioManager
import android.media.ToneGenerator
import android.provider.Settings//Tone 相关
const val DTMF_DURATION_MS = 120 // 声音的播放时间,毫秒class ToneHelper() {// 监视器对象锁private val mToneGeneratorLock = Any()// 声音产生器private var mToneGenerator: ToneGenerator? = null// 系统参数“按键操作音”标志位private var mDTMFToneEnabled = falsefun initToneGenerator(context: Context) {runOnBackgroundThread(Runnable {//按键声音播放设置及初始化try {// 获取系统参数“按键操作音”是否开启mDTMFToneEnabled = Settings.System.getInt(context.contentResolver,Settings.System.DTMF_TONE_WHEN_DIALING, 1) == 1synchronized(mToneGeneratorLock) {if (mDTMFToneEnabled && mToneGenerator == null) {mToneGenerator = ToneGenerator(AudioManager.STREAM_DTMF, 100) // 设置声音的大小if (context is Activity) {context.volumeControlStream = AudioManager.STREAM_DTMF}}}} catch (e: Exception) {e.printStackTrace()mDTMFToneEnabled = falsemToneGenerator = null}})}fun playTone(context: Context, dtmf: Int) {if (dtmf < 0) {return}if (!mDTMFToneEnabled) {return}val audioManager =context.applicationContext.getSystemService(Context.AUDIO_SERVICE) as AudioManagerval ringerMode = audioManager.ringerModeif ((ringerMode == AudioManager.RINGER_MODE_SILENT|| ringerMode == AudioManager.RINGER_MODE_VIBRATE)) {// 静音或者震动时不发出声音return}synchronized(mToneGeneratorLock) {mToneGenerator?.startTone(dtmf, DTMF_DURATION_MS) //发出声音}}fun release() {try {mDTMFToneEnabled = falsemToneGenerator?.stopTone()mToneGenerator?.release()mToneGenerator = null} catch (e: Exception) {e.printStackTrace()}}
}

线程池工具

package com.xg.practise.utilimport java.util.concurrent.Executors
import java.util.concurrent.ScheduledExecutorService
import java.util.concurrent.TimeUnitval executor: ScheduledExecutorService = Executors.newScheduledThreadPool(10)fun runOnBackgroundThread(runnable: Runnable?) {executor.execute(runnable)
}fun runOnBackgroundThread(runnable: Runnable?, delay: Long) {executor.schedule(runnable, delay, TimeUnit.MILLISECONDS)
}

主页面简单实现

package com.xg.practiseimport android.media.ToneGenerator
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.xg.practise.databinding.ActivityToneBinding
import com.xg.practise.util.ToneHelperclass ToneActivity : AppCompatActivity() {private var mToneHelper: ToneHelper? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)var dataBinding =DataBindingUtil.setContentView<ActivityToneBinding>(this, R.layout.activity_tone);setContentView(dataBinding.root)mToneHelper = ToneHelper()mToneHelper?.initToneGenerator(this@ToneActivity)var array = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "*", "0", "#")dataBinding.recycler.layoutManager = GridLayoutManager(this@ToneActivity, 3)dataBinding.recycler.adapter = object : RecyclerView.Adapter<MyViewHolder>() {override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {return MyViewHolder(LayoutInflater.from(parent.context).inflate(android.R.layout.simple_list_item_1, parent, false))}override fun getItemCount(): Int {return array.size}override fun onBindViewHolder(holder: MyViewHolder, position: Int) {holder.text.text = array[position]holder.text.setOnClickListener {mToneHelper?.playTone(holder.text.context,convertToneDtmf(array[position]))}}}}fun convertToneDtmf(key: String?): Int {return when (key) {"0" -> ToneGenerator.TONE_DTMF_0"1" -> ToneGenerator.TONE_DTMF_1"2" -> ToneGenerator.TONE_DTMF_2"3" -> ToneGenerator.TONE_DTMF_3"4" -> ToneGenerator.TONE_DTMF_4"5" -> ToneGenerator.TONE_DTMF_5"6" -> ToneGenerator.TONE_DTMF_6"7" -> ToneGenerator.TONE_DTMF_7"8" -> ToneGenerator.TONE_DTMF_8"9" -> ToneGenerator.TONE_DTMF_9"*" -> ToneGenerator.TONE_DTMF_S"#" -> ToneGenerator.TONE_DTMF_Pelse -> -1}}override fun onDestroy() {super.onDestroy()mToneHelper?.release()}class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {val text: TextView = itemView.findViewById(android.R.id.text1)}
}

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

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

相关文章

2023年【安全生产监管人员】考试题及安全生产监管人员考试内容

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【安全生产监管人员】考试题及安全生产监管人员考试内容&#xff0c;包含安全生产监管人员考试题答案和解析及安全生产监管人员考试内容练习。安全生产模拟考试一点通结合国家安全生产监管人员考试最新大纲及安…

(完全解决)如何输入一个图的邻接矩阵(每两个点的亲密度矩阵affinity),然后使用sklearn进行谱聚类

文章目录 背景输入点直接输入邻接矩阵 背景 网上倒是有一些关于使用sklearn进行谱聚类的教程&#xff0c;但是这些教程的输入都是一些点的集合&#xff0c;然后根据谱聚类的原理&#xff0c;其会每两个点计算一次亲密度&#xff08;可以认为两个点距离越大&#xff0c;亲密度越…

Python学习8

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

unity save load系统 快速搭建

我的最终目标是快读建立一个关卡数据自动读入储存功能&#xff1a; 1. 每个关卡有自己的编号&#xff0c;如果没有自定义该关卡&#xff0c;则读取默认编号的初始布局&#xff0c;如果有自定义该关卡&#xff0c;则读取新定义的关卡。 2.在游戏中如果对布局做出了更改&#x…

浅谈现代建筑照明中的智能照明控制系统

安科瑞 华楠 摘要&#xff1a;随着我国经济、技术的不断发展&#xff0c;科学技术在建筑中的应用不断地扩大&#xff0c;人们对物质文化和精神生活水平有了更高的追求&#xff0c;就当今建筑的发展来说&#xff0c;智能化已经成为主流&#xff0c;涵盖多个方面&#xff0c;包括…

JavaScript 原型链污染

1.prototype是一个类的属性&#xff0c;所有类对象在实例化的时候将会拥有prototype中的属性和方法2.一个对象的proto属性&#xff0c;指向这个对象所在的类的prototype属性1.每个构造函数(constructor)都有一个原型对象(prototype)2.对象的proto属性&#xff0c;指向类的原型对…

MES生产管理系统与供应链协同管理

MES生产管理系统在制造业中发挥着越来越重要的作用&#xff0c;它与供应链管理密切相关&#xff0c;对于提高供应链的协同和优化有着重要的意义。本文将探讨MES管理系统与供应链管理之间的关系&#xff0c;包括实时数据共享、生产计划协调和供应链效率提升等方面。 MES系统能够…

RabbitMQ 消息模型

参考 ​​​​​​【RabbitMQ】RabbitMQ架构模型_rabbitmq结构模型-CSDN博客 之前的学习都只是知道名字&#xff0c;但并没有真正的理解&#xff0c;每次看还是不懂&#xff0c;所以今日理解透 &#xff01; RabbitMQ 收发消息过程如下&#xff1a; 首先从消费者开始&#xff1…

OpenCV视频车流量识别详解与实践

视频车流量识别基本思想是使用背景消去算法将运动物体从图片中提取出来&#xff0c;消除噪声识别运动物体轮廓&#xff0c;最后&#xff0c;在固定区域统计筛选出来符合条件的轮廓。 基于统计背景模型的视频运动目标检测技术&#xff1a; 背景获取&#xff1a;需要在场景存在…

postgresql|数据库迁移|ora2pg工具的web界面介绍

前言&#xff1a; ora2pg是一个比较强大的数据库迁移工具&#xff0c;那根据名字来说&#xff0c;也可以看出来&#xff0c;这个工具主要是用来配置去O化&#xff0c;将在运行的oracle数据库迁移到postgresql数据库内的 当然了&#xff0c;我们使用此工具主要还是用命令行&am…

Windows下 MySql 5.7授权远程登陆

1.用管理员身份打开mysql Client 2.输入密码登录 3.使用mysql数据库&#xff0c;输入“use mysql” 4.查看当前服务中使用的用户 select host,user form user; 5.授权 grant all privileges on *.* to 用户名% identified by 密码 with grant option; 6.成功后&#xff0c;刷…

Docker部署SpringBoot +Vue项目流程详解(含域名 + HTTPS)

文章目录 前言1、选购服务器2、部署 Docker3、前端、后端项目打包4、配置 Dockerfile5、配置 Nginx6、配置 DockerCompose6、启动 DockerCompose 完成部署7、【可选】域名 SSL证书 前言 本次整体部署操作使用阿里云服务器&#xff0c;这里我选择的是香港地区的2核2G ECS&…

自动驾驶感知算法面经(20+)

原文链接: https://zhuanlan.zhihu.com/p/656952371 本人2022年4月和2023年7月两次跳槽找工作&#xff0c;面经总结在这里&#xff0c;希望可以帮到需要的朋友。 项目相关的问题主要和经历有关&#xff0c;参考性不大。 2023年7月 1. 文远知行 自动标注算法岗位 项目经历问…

Delete `␍`eslintprettier/prettier

将CRLF改为LF 然后就消失了 除此之外,也可以修改git全局配置 git config --global core.autocrlf false

JavaScript基础知识15——专业术语:语句和表达式

哈喽&#xff0c;大家好&#xff0c;我是雷工。 今天看到了JavaScript中的专业术语&#xff1a;语句和表达式&#xff0c;以下为学习笔记。 1、表达式概念&#xff1a; 表达式是可以被求值的代码&#xff0c;JavaScript引擎会将其计算出一个具体的结果。 示例&#xff1a; a…

Babylonjs学习笔记(二)——创建基本材质

书接上回&#xff0c;这里讨论给网格添加材质&#xff01;&#xff01;&#xff01; 准备好材质 1、创建材质球 /*** 创建网格材质* param scene 场景对象* returns 材质对象*/ const createGroundMaterial(scene:Scene):StandardMaterial>{const texArray:Texture[] []// …

什么是供应链金融?

一、供应链金融产生背景 供应链金融兴起的起源来自于供应链管理一个产品生产过程分为三个阶段&#xff1a;原材料 - 中间产品 - 成产品。由于技术进步需求升级&#xff0c;生产过程从以前的企业内分工&#xff0c;转变为企业间分工。那么整个过程演变了如今的供应链管理流程&a…

JavaScript-1-菜鸟教程

将内容写到 HTML 文档中 - - - document.write() <script>// 括号里的内容要有引号document.write("<h1>这是一个标题</h1>");document.write(<div class"box">hello world</div>);</script><style>.box{width…

字符串的创建(直接赋值与new的区别)- 字符串常量池

文章目录 1.字符串 "hello" 与 new String("hello")的区别2.intern()的使用&#xff1b; 总结 本文开始 1.字符串 “hello” 与 new String(“hello”)的区别 字符串常量池&#xff1a;存储着创建的引用地址的引用 String s1 "hello"; String…

【数据中台建设系列之二】数据中台-数据采集

​ 【数据中台建设系列之二】数据中台-数据采集 上篇文章介绍了数据中台的元数据管理&#xff0c;相信大家对元数据模块的设计和开发有了一定的了解&#xff0c;本编文章将介绍数据中台另一个重要的模块—数据采集。 一、什么是数据采集 数据采集简单来说就是从各种数据源中抓…