相关疑难解决方法(0)

Android AudioRecord强制另一个流到MIC音频源

更新3:我与另一位开发人员合作,我们似乎找到了一个可以为一大笔钱做这件事的人.他们给我们发了一个测试apk,它似乎工作.我们将继续购买该来源.我希望我们不会被骗.我发现后我会更新

更新2:仍在努力.在经历了更多痛苦的日子后,我现在认为没有任何花哨的事情发生,但他们只是在原生方使用AudioFlinger(请参阅链接)来调用AudioFlinger :: setParameters

我现在正在寻找如何编写一个简单的JNI来调用AudioFioger :: setParameters with audio_io_handle_t ioHandle,const String8&keyValuePairs

我知道keyValuePairs可以是什么,但不是关于audio_io_handle_t的线索

更新:我现在相信其他应用可能正在使用QF音频与CAF.请参阅链接上的 audio_extn_utils_send_audio_calibration

链接中的 voice_get_incall_rec_snd_device 相同

我没有C/++知识.我怎样才能知道我是否可以从原生方面调用这些方法?由于其他应用程序可以,必须有一种方法.


我每天至少要工作5-6个小时,一直在努力奋斗40天.我不确定是否允许这样做,但我很乐意为正确答案捐款.

我有一个使用VOICE_CALL音频源的通话录音应用程序.尽管ASOP没有实现/授权,但大多数制造商已经实施了VOICE_CALL,使用VOICE_CALL音频源的应用在许多设备上运行良好.那是直到Android 6.

谷歌改变了Android 6的这种行为.现在打开VOICE_CALL音频源需要android.permission.CAPTURE_AUDIO_OUTPUT,它只被授予系统应用程序.

这基本上会停止通话记录,或者它应该有.好吧,它确实为我和200多个其他通话录音应用程序,除了3个已找到解决此限制的方法.

我一直在使用Android 6在许多不同的手机上尝试这些应用程序,并在他们设法记录的方式中发现了某些特征.

他们都使用Android AudioRecord类并打开MIC音频源.我也做; 但在我的应用程序中,我只从MIC而不是另一方获得音频.我发现的是告诉我他们在开始录制之前或之前发出了某种系统调用.

看一下成功记录VOICE_CALL的应用程序之一的以下日志形式,即使它使用MIC进行记录.看起来应用程序是如何管理混合/路由/流/合并VOICE_CALL音频源到MIC.

- D/audio_hw_primary: in_set_parameters: enter: kvpairs=input_source=1;routing=-2147483644
- D/PermissionCache: checking android.permission.MODIFY_AUDIO_SETTINGS for uid=10286 => granted (432 us)
- D/audio_hw_primary: in_set_parameters: enter: kvpairs=input_source=4;routing=-2147483584;format=1
- D/audio_hw_primary: select_devices: out_snd_device(0: ) in_snd_device(283: voice-dmic-ef)
- D/hardware_info: hw_info_append_hw_type : device_name = voice-dmic-ef
- D/voice: voice_get_incall_rec_snd_device: in_snd_device(283: …
Run Code Online (Sandbox Code Playgroud)

c java android android-ndk qualcomm

81
推荐指数
1
解决办法
6404
查看次数

某些应用程序如何克服电话录制限制?

背景

Android上并不支持手机录音,但有些设备在某种程度上支持它.

这使得各种呼叫录制应用收集了关于设备的可能信息以及应该对它们做什么,并决定该做什么.

有些甚至提供根解决方案.

一个这样的例子是boldbeast Call Recorder应用程序,它提供了许多不同的配置来改变:

在此输入图像描述

  • "记录模式".显示非root用户设备的14种模式,root用户最多34种模式.对于root设备,还显示"Alsa mode"作为它的选项.

  • 具有"调谐音频效果"("自动调整一组参数").

  • 具有"调谐音频路由",可能的值为"已禁用","组1","组2","组3"

  • 对于有根设备:

    • "更改音频控件"("自动更改音频控件")

    • "更改音频驱动程序"(更改音频驱动器设置以启用记录模式21,22,23,24,31,32,33,34")

    • 对于有根设备:"开始输入流"

问题

如果我需要创建一个呼叫录制应用程序,除了找到各种设备的各种解决方法之外别无他法,但似乎其他应用程序使用API​​中没有出现的术语.

例如,我找不到我提到的任何应用程序中的任何一个.

我发现了什么

除了大量关于如何在Android上录制电话的问题,显示它不适用于所有设备,我可以找到一些有趣的东西.以下是我到目前为止的尝试和见解:

  • 我们可以在准备录音时使用一些录音源(这里是文档),但遗憾的是在每个设备中它可能会有所不同.对于一些人来说,VOICE_CALL是有效的,对某些人来说也是如此.但至少我们可以尝试......

  • 在安装了Android 6.0.1的OnePlus 2上,可以使用VOICE_CALL录制来电,但是我无法在那里录制拨出电话,除非我将MIC作为音频源与扬声器开启一起使用.不知何故,我提到的应用程序成功录制它没有任何问题.我相信我会看到其他Android设备的其他问题,因为我过去曾试图解决这个问题.更新:我发现了这个示例项目(也在这里),由于某种原因,它在UI线程preparestartmediaRecorder调用之间休眠2秒.它工作正常,当我做类似的事情(等待使用Handler.postDelayed 1秒),它也工作得很好.在那里写的评论是"有时准备需要一些时间才能完成".

  • 在使用Android 8的Galaxy S7上,无论我做了什么,我都无法获得传出呼叫和来电(即使是MIC和扬声器)的另一方声音,但我提到的应用程序运行正常.

  • 为了让你尝尝我的通话录音的POC,我已经发表了开放源代码的github仓库在这里,有一个样品,将记录一个电话,让你聆听到最新的一个,如果一切运作良好.

  • 这个"ViktorDegtyarev - CallRecLib"SDK似乎根本不起作用,并在各种Android版本上崩溃

  • 这两个旧的示例项目:rvoix,esnyder-callrecorder,都无法实际记录.第二个似乎甚至不适用于它应该支持的Android 6.0.1设备.

  • aykuttasil - CallRecorder示例和 axet - android-call-recorder示例 - 两者,就像在我的POC上一样,除了AudioSource之外没有任何调整,因此他们无法记录某些情况,例如OnePlus 2输出 -拨出电话的音频.

  • 大多数第三方应用程序仅提供AudioSource调整,但有些(如"boldbeast")确实提供更多.一个例子是" 自动呼叫记录器 ",其具有"配置"(10个值可供选择,首先是"默认")和"方法"(5个值可供选择,首先是"默认").这些应用程序可能不希望其他人理解这些配置的含义,因此他们会使用通用名称.或者,它对每个人来说都太复杂了(特别是对于用户而言),所以他们概括了名称.

  • 有"setMode"的API 在这里,但它似乎并不在调用它改变.我想也许可以通过这种方式改变呼叫使用位置的"通道",但它不起作用.它在调用期间保持为"2"的值,即MODE_IN_CALL.

  • 有各种设​​备可用的自定义参数(每个OEM及其自己的参数),这些参数可以在这里设置,甚至可以通过JNI( …

audio android call-recording

38
推荐指数
1
解决办法
3512
查看次数

有没有办法在 flutter 中创建通话录音应用程序?

因此,我尝试开发一个通话录音应用程序:

  • 通过使用flutter_sound录制通话,我使用phone_state_i检测通话状态,但成功地用麦克风的声音录制通话,但无法录制其他人的声音(传入语音)。
  • 然后我尝试通过flutter原生集成使用android来记录通话但无法实现。所以即使在这里我也成功地只记录了麦克风的声音。

我想我无法理解 VOICE_DOWNLINK 和 VOICE_UPLINK 的概念。并且知道 VOICE_CALL 已被弃用。所以,我陷入了困境,需要一些专家的建议。

phone-call recording flutter call-recording

17
推荐指数
1
解决办法
9717
查看次数

如何以编程方式获取MIUI Security app自动启动权限?

我没有收到BOOT_COMPLETE我的小米Redmi 2 Prime手机的广播.

BroadcastReciever是---

public class OnBootReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    // Setting singleAlarm
    SingleAlarmHandler.getInstance().setAlarm(context);

    try {
        // Sending System Setting broadcast
        String offDate = SharedPrefrencesHandler.getInstance(context).readString(SharedPrefrencesConstants.SWITCH_OFF_DATE);
        int type = SystemSettingsType.PHONE_SWITCH_ON_OFF.getNumericType();

        if (offDate == null)
            offDate = "";

        SystemSettingsHandler.getSystemSettingsHandler().makeSystemSettingsCall(context, type, offDate);
        SharedPrefrencesHandler.getInstance(context).removePrefrence(SharedPrefrencesConstants.SWITCH_OFF_DATE);
        } catch (Exception e) {
            Log.e(ChaseForceApplication.TAG, e.getMessage());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和清单:

    <receiver
        android:name=".broadcastlisteners.OnBootReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

经许可:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Run Code Online (Sandbox Code Playgroud)

现在我没有在我的小米Redmi 2 Prime手机中获得BOOT …

android miui

13
推荐指数
1
解决办法
1万
查看次数