小白安卓编程之旅(1)

文章目录

  • 0.目标
  • 1.环境构建
    • 1.1安装软件
    • 1.2需要gradle
    • 1.3SDK搬家
    • 1.4模拟器
  • 2.界面
    • 2.1加按钮
  • 3.代码
    • 3.1权限
    • 3.2录音
    • 3.3分贝
    • 3.4自动循环录音
    • 3.5发送情况至对端
    • 3.6服务端生成Token
    • 3.7邮件发送提醒
    • 3.7其他无关紧要的
    • 3.8代码合并
  • 4.总结

0.目标

本地手机存储3-5首音乐,当外部设备播放某一音乐时,使用听歌识曲判断音乐名称,然后发送至手机,发送方式暂定为邮箱。软件为个人使用,很多安全性问题没有认真考虑,读者可自行修改。

1.环境构建

从网上下载好android studio,SDK,JDK

1.1安装软件

按照JDK-android studio-SDK的顺序安装好几个软件,再从SDK里下载好各类推荐软件,android studio打开后会自动加载并开始下载一些没有的软件

1.2需要gradle

从网上下载好gradle,解压到一个文件夹里,从setting里找到gradle配置,改好地址就行

1.3SDK搬家

发现SDK自动下载到C盘,所以搬家,说是存储路径不能有空格,所以放到D盘根目录

1.4模拟器

打算用android studio自带的,下载好后发现不行,我的CPU不支持什么VT-x,所以下载Genymotion,但是发现未响应,在查找问题的过程中发现可以使用真机模拟,所以又尝试真机,通过ADB驱动安装最终识别出来

2.界面

先使用原装界面和控件,后续再做优化

2.1加按钮

默认使用constraintlayout布局,加了button后要再加个

之后又随便改了一些名称显示之类的

3.代码

先实现录音

3.1权限

这里根据第一行代码里第八章的内容
权限如下,合并了一下

在AndroidManifest里先声明

在MainActivity里检验是否授权

这里又重写了一下onRequestPermissionsResult(这里可能用来第一次提示授权的时候记录用户选择内容的,如果选了始终允许,后续不再出现,个人使用,只要能实现即可未深入测试)

3.2录音

对各类实现方法都有了了解,最终采纳Amoy阿磊-Android实现录音功能汇总的结果,使用MediaRecorder。
但一直未准备好,问题出在setOutputFile需要填写文件路径,已经尝试过Environment.getExternalStorageDirectory(),但是getExternalStorageDirectory这个函数不让用了;尝试过context.getExternalCacheDir()系列,是Context一直是红色不可用,不知为何。最后发现可以写file,如github大神写的一样,但是大神的

这句无法准确得到文件位置放到setOutputFile里(可能是我不会),又查到jeffrey12138这位大神的kotlin-Android存储原理相关的内容很多但把代码写明白的就这个了,里面用到getExternalFilesDir(null)absolutePath可以直接使用,很方便。
为方便读写,设置了时长为15秒,然后发现保存的文件不能播放,找了半天原因发现没有主动stop,之前见有介绍MediaRecorder说到时间会自动保存,这里发现可能是有问题的,所以要主动停一下。综合几种定时器,最终选择了Young_cloud的CountDownTimer,当然也不是完全一样,如TODO(“not implemented”)需要删除、onTick和onFinish()都要重写,感谢qijingwang和m0_46301460。同时发现有个提示说主进程干活太多了,加上后面要判断分贝,所以可能要加上线程相关内容了。
至此,顺序实现录音,mp4格式,在本机可直接播放,不知道后面发送出去能不能不保存使用软件或邮箱直接播放,走一步看一步吧,代码如下:
不知道为啥,要把lateinit var Pathfile: String放在class MainActivity的外面。recorder = MediaRecorder()要放在fun recordStart()外面。没仔细研究,反正AS都有提示。

3.3分贝

一开始想按照正规的分贝仪进行设计,发现好难啊,最终采用Android实时获取音量(单位:分贝)(这个文章好经典,6万阅读)里写的getMaxAmplitude方法,Android 录音getMaxAmplitude()这里提到要把getMaxAmplitude方法写到线程里,最终得到如下代码。

maxAmplitude要在线程里启用

3.4自动循环录音

以为循环很容易,发现存在几个致命问题:
1.每次点击按钮录音结束后再点击录音就会闪退,日志都来不及写,最后发现是MediaRecorder()实例化后没有清除,找到一些代码发现可以用来清除,但AS提示MediaRecorder()是非空类型,最后发现要用这种定义方法,才会有null;
2.自动循环用while每次执行recorder的时间不足每次记录15秒,用for首先要确定执行次数,我想的是一直执行,不停的那种,不过也可以随便写个比较大的数(事实上最后就是用这个比较大的数实现的循环,不过不是for),再就是无法延迟执行,这个问题同while;
3.想到用Handler和线程完成,但因为fenbei要用到线程,recorder无法再使用线程(好像是因为kotlin没有父子线程的原因,第一行代码在讲解协程的时间写到的是线程都是顶级的),又想尝试用每个结果位置加个线程传递参数,但发现fenbei里只要确定分贝>50就要传递参数,录音就无法完成,甚至不能播放,就又又想把分贝全写到数组里,但无奈没有找到可以收集动态创建的线程的结果的数组赋值方法,最终放弃(其实想想好像也不是不行,毕竟已经检测到大分贝了说明已经有提示了,可以进行下一步信息网络传递了,不需要录音文件);
4.又又又想着用延迟定时来实现recorder执行,如何在Kotlin中延迟后调用函数

来源:爱梅尼的彬哥哥

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年1月25日
下一篇 2021年1月25日

相关推荐