zoukankan      html  css  js  c++  java
  • 一台手机如何在微信语音/视频通话时把声音录下来

    背景

    微信语音/视频开会一遍听不清楚
    和客户微信语音沟通过后又忘记重点
    保留重要的人的语音音频
    懒得用另外的设备录音?

    解决方案

    既然微信没有保存语音聊天的功能,自己加一个不就好了吗?!

    本文结束!
    Alt

    功能实现

    1、 依赖Xposed框架(非root环境),给微信添加自定义的功能;
    2、 微信语音文件(.amr格式)生成到自定义目录

    ( 默认目录:SD卡/tencent/micromsg/用户/voice2)

    3、 提供将.amr格式文件转换成.mp3的功能;

    文末附源码

    使用流程

    1. 安装一个Xposed框架(推荐Xpatch
    2. 将微信和此模块添加到框架里
    3. 语音/视频通话时,建议开启免提,使对方的声音更清楚
    4. 正常使用微信即可生成文件,平时无感知

    预览

    1. 点击左.amr文件可在右侧生成.mp3格式文件
    2. 点击mp3文件点击可直接播放
    3. 可在右上角设置mp3输出文件路径

    录音文件播放语音

    思路

    //发起或接听语音视频通话时,调用微信音频方法
    
    object LogHook:IXLogHook{
        //直接从日志入手
        override fun onXLogWrite(level: String, tag: String, msg: String) {
             if(tag.contains("MicroMsg.Voip.VoipMgr")){
                if(msg.contains("onAccept")||msg.contains("on accept")){//接听
                        if(Objects.ActivityParam!=null){
                        val outClassCon=Classes.ClassInternal.getDeclaredConstructors()[0]
                        val mContext=Objects.ActivityParam as Context
                        val mmContext=mContext.applicationContext
                        val outClassIntence=outClassCon.newInstance(mmContext,false)
                        val interClasseCon=Classes.ClassInternal.declaredClasses[0]
                        val con=interClasseCon.getDeclaredConstructors()[0]
                        con.setAccessible(true)
                        val interClasseInstance=con.newInstance(outClassIntence)
                        val methodGo= Classes.ClassInternal.getDeclaredMethod("go", C.String)
                        val Amethodgo=methodGo
                        Amethodgo.setAccessible(true)
                        val success = Amethodgo.invoke(outClassIntence,"_pathGo_") as Boolean
                        val methods= interClasseCon.getDeclaredMethod("run")
                        val Amethod=methods
                        Amethod.setAccessible(true)
                        Amethod.invoke(interClasseInstance)
                    }
                if(msg=="finish"){//挂断
                    if(Objects.ActivityParam!=null){
                        val outClassCon=Classes.ClassInternal.getDeclaredConstructors()[0]
                        val mContext=Objects.ActivityParam as Context
                        val mmContext=mContext.applicationContext
                        val outClassIntence=outClassCon.newInstance(mmContext,false)
                        val methods= Classes.ClassInternal.getDeclaredMethod("reset")
                        val Amethod=methods
                        Amethod.setAccessible(true)
                        Amethod.invoke(outClassIntence)
                    }
    

    待实现的功能

    1. 使用微信备注和联系人昵称替换随机文件名;
    2. 支持录音时长设置
    3. 音频文件生成延迟结束的问题
    4. 播放页优化

    为什么会有bug呢……第一次做android,第一次用kotlin,两件快乐事情重合在一起。而这两份快乐,又给我带来更多的快乐。得到的,本该是一次通过、完美运行……但是,为什么,会变成这样呢……
    啪

    已测试设备

    备注:手机系统必须支持多个应用同时使用音频接口(如微信和微信小程序可以同时录音)

    测试设备结果
    小米miui11、安卓10支持
    华为Emui9、安卓9不支持
    google pix、安卓10支持
    oppo、安卓10不支持

    源代码

  • 相关阅读:
    Tomcat线程参数
    CDH平台规划注意事项
    python 不同数据类型的序列化
    Python 中__new__方法详解及使用
    线程生命周期
    如何在JAVA中每隔一段时间执行一段程序
    手动开启是事务提交回滚
    MySQL数据类型转换函数CAST与CONVERT的用法
    mybatis插入是返回主键id
    解决dubbo注册zookepper服务IP乱入问题的三种方式
  • 原文地址:https://www.cnblogs.com/Zdelta/p/14122317.html
Copyright © 2011-2022 走看看