安卓利用Xposed实现通话双向录音

  • 关于MediaRecorder 的VOICE_CALL音源
  • 方法1 设置app的uid
  • 方法2 Xposed更改权限获取的判定
    • 1.VOICE_CALL相关权限的验证
    • 2.CAPTURE_AUDIO_OUTPUT权限的验证逻辑
    • 3.xposed修改方法返回值
  • 参考文章和链接

关于MediaRecorder 的VOICE_CALL音源

在Android M以上的版本,将因为设置为VOICE_CALL,会发现调用recorder.prepare(),会抛出异常。这是由于此功能现在只开放给系统APP。

方法1 设置app的uid

根据上面提到的,我们可以想办法将我们的APP打包成系统级app,方法就是在AndroidManifest.xml中的manifest接地那中加入以下代码:

android:sharedUserId="android.uid.system"

然后用platform.pk8和platform.x509.pem两个文件以及Android提供的Signapk工具来签名。
可以参考:系统apk签名

注意,此方法只对原生系统有用,定制ROM例如miui,由于签名文件不一样,并且也没办法找到签名有关文件,所以此方法会不管用。

方法2 Xposed更改权限获取的判定

1.VOICE_CALL相关权限的验证

除了普通的录音权限意外,查看源码,会发现还需要另外一项权限,这是android-30源码中对于这个变量的解释:

/** Voice call uplink + downlink audio source* <p>* Capturing from <code>VOICE_CALL</code> source requires the* {@link android.Manifest.permission#CAPTURE_AUDIO_OUTPUT} permission.* This permission is reserved for use by system components and is not available to* third-party applications.* </p>*/
public static final int VOICE_CALL = 4;

所以我们还需要在Manifest文件中加入下面一行:

<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"/>

2.CAPTURE_AUDIO_OUTPUT权限的验证逻辑

这里我们用到一个网站:http://androidxref.com/
此网站可以用于搜索安卓源码中的内容,我们选择一个分支比如8.1.0_r33,然后搜索,如下图:

会发现,第一条结果似乎就是我们想要的内容,点进去看,搜到的这段代码内容如下:

bool captureAudioOutputAllowed(pid_t pid, uid_t uid) {if (getpid_cached == IPCThreadState::self()->getCallingPid()) return true;static const String16 sCaptureAudioOutput("android.permission.CAPTURE_AUDIO_OUTPUT");bool ok = checkPermission(sCaptureAudioOutput, pid, uid);if (!ok) ALOGE("Request requires android.permission.CAPTURE_AUDIO_OUTPUT");return ok;
}

原来这个权限的判断是在C++的代码里面,但是我们想的使用Xposed来解决,所以要继续往下看,寻找思路。
接下来的搜索,需要掌握一些C++语法相关内容,我们根据返回值和传入的参数,可以这样搜索:

记得,要用""把搜索内容引用起来,这样搜索才是完全匹配的搜索。
结合后面传入的两个参数类型,一个是pid_t,一个是uid_t,IServiceManager.cpp就是我们需要的,点进去,只需要关注三行代码:

bool res = pc->checkPermission(permission, pid, uid);sp<IBinder> binder = defaultServiceManager()->checkService(_permission);pc = interface_cast<IPermissionController>(binder);

第一行是获取返回值,第二行的是给pc这个对象赋值。作者虽然不熟悉C++,但是根据代码内容大胆猜测,这是名为IPermissionController的东西是一个aidl接口,所以必然有个java类会继承这个接口,接下来就去搜索extends IPermissionController.Stub就可以发现是一个名为PermissionController的类继承了它,并且这个类是在ActivityManagerService.java中。相关代码如下:

static class PermissionController extends IPermissionController.Stub {ActivityManagerService mActivityManagerService;PermissionController(ActivityManagerService activityManagerService) {mActivityManagerService = activityManagerService;}@Overridepublic boolean checkPermission(String permission, int pid, int uid) {return mActivityManagerService.checkPermission(permission, pid,uid) == PackageManager.PERMISSION_GRANTED;}@Overridepublic String[] getPackagesForUid(int uid) {return mActivityManagerService.mContext.getPackageManager().getPackagesForUid(uid);}@Overridepublic boolean isRuntimePermission(String permission) {try {PermissionInfo info = mActivityManagerService.mContext.getPackageManager().getPermissionInfo(permission, 0);return (info.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)== PermissionInfo.PROTECTION_DANGEROUS;} catch (NameNotFoundException nnfe) {Slog.e(TAG, "No such permission: "+ permission, nnfe);}return false;}}

3.xposed修改方法返回值

经过以上分析,我们只需要在包名为android的时候,添加如下代码就可以通过CAPTURE_AUDIO_OUTPUT的权限验证:

XposedHelpers.findAndHookMethod("com.android.server.am.ActivityManagerService$PermissionController", lpparam.classLoader,"checkPermission",String.class, int.class, int.class, new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {String[] packages = (String[]) XposedHelpers.callMethod(param.thisObject, "getPackagesForUid", param.args[2]);if (Arrays.asList(packages).contains("你的应用包名")) {if (("android.permission.CAPTURE_AUDIO_OUTPUT").equals(param.args[0])){param.setResult(true);}}}});

本文涉及的代码内容很简单,更多地是想提供思路跟大家分享。

参考文章和链接

[1]: 【Android 进阶】Apk 使用系统签名https://www.jianshu.com/p/63d699cffa1a
[2]: Android native 权限控制流程https://blog.csdn.net/shift_wwx/article/details/80519212
[3]:Permission failure: android.permission.CAPTURE_AUDIO_OUTPUT 解决办法 https://blog.csdn.net/u012932409/article/details/103385064

安卓利用Xposed实现通话双向录音相关推荐

  1. 安卓手机管理软件_vaa云录音app下载-vaa云录音手机版下载v1.1.9 安卓版

    vaa云录音app是一款手机录音软件,软件功能全面,使用方便,在这里为用户提供最方便的录音服务,不管是什么方面的录音,在这里都可以通过软件完成,为你带来最方面实用的录音服务,感兴趣的朋友快来下载看看吧 ...

  2. c++ 实现录音并且指定到文件_通话自动录音,留下美好回忆,记录完整录音证据...

    手机通话,如果自动录音多好,许多人与我一样抱有这个想法. 记得华为Android版本5.0时代,手机没有自动录音功能,我一直到网上下载自动通话录音软件,有时甚至是下载ROOT版的带自动通话功能的EMU ...

  3. android 安卓 pc 电脑 通讯,安卓利用Socket和PC通信无法连接?

    安卓利用Socket和PC通信无法连接 已经设置了 相同代码PC端和PC端通信没有问题 会在new Socket(ip,port)这里一直堵塞: 服务器代码 public ServiceThread( ...

  4. 利用 Xposed 快速实现一个简易微信机器人

    目标 当前微信网页版限制越来越多,考虑尝试在手机上实现类似机器人的功能.本文目的是利用 Xposed 快速实现简易机器人功能,包括获取好友发来的消息,以及回复消息.后续可以增加智能回复,比如接入图灵机 ...

  5. 苹果手机通话怎么录音?通话录音的详细教程!

    案例:iPhone怎么一边通话一边录音? [苹果手机通过普通的方式不能边通话边录音,有什么方法可以帮到我吗?感谢!] 录制通话可以帮助用户记录重要的电话内容,如商务谈判.家庭事务等.但是录音涉及隐私, ...

  6. Android 中利用XPosed拦截系统消息

    一.前言  关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xp ...

  7. 利用xposed自动获得支付宝个人收款二维码链接和收款记录

    一.说明 现在的App一般都会带有支付功能,而现在比较流行的支付一般有支付宝.微信.银行卡等,一般情况下,应用开发者会直接对接支付宝.微信或者第三方支付公司的Api,以完成支付,但是都需要收取不小的费 ...

  8. pyaudio usb playback_利用python工具包pyaudio实现录音

    想训练一套自己的语音识别系统(命令词识别系统),首先得准备一套自己的语料库,发动身边的帅哥美女们帮忙进行录音.Python无所不能,很多工具包能给让我们的工作变的简单.优雅. 今天就给大家分享一下基于 ...

  9. html怎么能调用微信语音,华为微信的语音通话怎么录音

    在用手机打电话时,如果我们想保留通话内容,会启用录音功能将其录制下来.现在很多人直接用微信进行语音通话,那华为微信的语音通话怎么录音? 华为微信的语音通话怎么录音? 以荣耀20s MagicUI2.1 ...

  10. 利用xposed修改微信显示余额

    利用xposed修改微信显示余额 package com.dahai.demo;import android.content.Context; import android.content.Share ...

最新文章

  1. adb 显示手机分辨率
  2. tpp letter
  3. 一些琐碎+分不清的知识点
  4. 【复习】快速幂算法详解
  5. LeetCode 575. 分糖果(set集合去重)
  6. lua jit java jit_Lua JIT 2.0 发布了,一百五十倍的性能提升!
  7. javascript系统系列:浅析js中的浏览器循环事件(eventLoop)
  8. python文件操作(路径、移动、复制、见目录)
  9. hdu4707 Pet(bfs dfs,vector)
  10. Android系统信息获取 之十:移动网络相关信息获取
  11. json dumps dump区别
  12. Java递归算法实例
  13. [校招] 英文句子单词反转 - 哔哩哔哩 2020
  14. 技嘉主板u盘启动快捷键介绍
  15. angr符号执行用例解析——CSCI-4968-MBE
  16. 赣州旅游职业学校学计算机,赣州旅游职业学校是公办的吗
  17. 关于switchport Port-security 使用遇到的一些问题
  18. 4.基于Android 12 分析系统启动过程
  19. 基于天问block编译环境下ASRPRO语音芯片程序编写教程(一)软件下载与基础程序语句篇
  20. java项目-第122期ssm校园快递物流管理系统-计算机毕业设计项目

热门文章

  1. workman php 安装,windows 安装workman本地快速入门
  2. android 全局悬浮按钮,Android自定义APP全局悬浮按钮
  3. 用python画竹子_基于Python的一个简单爬虫(糗事百科爬虫)
  4. 华为手机电源键不止锁屏关机那么简单!这些操作不能浪费,望周知
  5. V社线下沙龙·深圳站——12.05(周六)
  6. 物联网无线通信技术 低功耗WiFi模块 WiFi芯片技术应用
  7. 计算机硬盘中病毒吗,硬盘中病毒能格式化吗
  8. 内存报错:Cannot allocate memory
  9. 无人驾驶技术——YOLO目标检测
  10. [转]斗鱼大数据搭建的经验和坑