nLL*_*nLL 81 c java android android-ndk qualcomm
更新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: voice-dmic-ef) incall_record_device(283: voice-dmic-ef)
Run Code Online (Sandbox Code Playgroud)
正如您在第一行中看到的那样,它以MIC音频源input_source = 1开始;路由= -2147483644.
然后,在第二行它做了一些事情并获得了android.permission.MODIFY_AUDIO_SETTINGS,这是正常的权限,我的应用程序也有.这似乎是最重要的部分,看起来所有3个人都在使用JNI做他们所做的事情来触发VOICE_CALL音频源到MIC的流式/合并并用标准的AudioRecorder API录制
在下一行,您会看到音频硬件开始混合VOICE_CALL(input_source = 4),即使它们已打开MIC(1)音频源.
我以为他们用过了
AudioManager.setParameters("key=value")
Run Code Online (Sandbox Code Playgroud)
并尝试了许多变化,如
AudioManager.setParameters("input_source=4;routing=-2147483584;format=1")
Run Code Online (Sandbox Code Playgroud)
没有运气.
然后,我发现Android,NDK,音频路由,通过耳机强制音频,并认为他们可能是混合/路由/流/合并VOICE_CALL如何进入当前的AudioRecord会话和(因为没有C知识)试图使用通货再膨胀没有运气,用下面的代码(再次)实现同样的事情.
private static void setForceUseOn() {
/*
setForceUse(int usage, int config);
----usage for setForceUse, must match AudioSystem::force_use
public static final int FOR_COMMUNICATION = 0;
public static final int FOR_MEDIA = 1;
public static final int FOR_RECORD = 2;
public static final int FOR_DOCK = 3;
public static final int FOR_SYSTEM = 4;
public static final int FOR_HDMI_SYSTEM_AUDIO = 5;
----device categories config for setForceUse, must match AudioSystem::forced_config
public static final int FORCE_NONE = 0;
public static final int FORCE_SPEAKER = 1;
public static final int FORCE_HEADPHONES = 2;
public static final int FORCE_BT_SCO = 3;
public static final int FORCE_BT_A2DP = 4;
public static final int FORCE_WIRED_ACCESSORY = 5;
public static final int FORCE_BT_CAR_DOCK = 6;
public static final int FORCE_BT_DESK_DOCK = 7;
public static final int FORCE_ANALOG_DOCK = 8;
public static final int FORCE_DIGITAL_DOCK = 9;
public static final int FORCE_NO_BT_A2DP = 10;
public static final int FORCE_SYSTEM_ENFORCED = 11;
public static final int FORCE_HDMI_SYSTEM_AUDIO_ENFORCED = 12;
public static final int FORCE_DEFAULT = FORCE_NONE;
*/
try {
Class audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
setForceUse.invoke(null, 0, 0); // setForceUse(FOR_RECORD, FORCE_NONE)
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
显然,我缺少一些可以使录音成为可能的东西.
我甚至愿意付钱获取这些信息,但都拒绝了.我已经说过了.如果我发现它,我会发布一次!
你对他们可能在做什么有什么想法吗?
我和我的搭档能够购买我们想要的东西.我们在正确的道路上,你在本机上设置keyValuePairs.
遗憾的是,由于我们为其编写的公司的许可限制,我无法发布源代码
| 归档时间: |
|
| 查看次数: |
6404 次 |
| 最近记录: |