अद्यतन 3: मैंने एक और डेवलपर के साथ भागीदारी की है और हमें ऐसा कोई व्यक्ति मिला है जो धन के बड़े योग के लिए ऐसा कर सकता है। उन्होंने हमें एक एपीके एपीके भेजा है और यह काम करने लगता है। हम आगे बढ़ेंगे और स्रोत खरीदेंगे। मुझे उम्मीद है कि हम घोटाला नहीं करेंगे। एक बार पता लगने के बाद मैं अपडेट करूंगा
अपडेट 2: अभी भी इस पर काम कर रहे हैं। अधिक दर्दनाक दिनों के बाद मैं अब लगता है कुछ भी नहीं फैंसी चल रहा है, लेकिन वे केवल AudioFlinger (प्रयोग कर रहे हैं लिंक देखें कॉल करने के लिए देशी ओर) AudioFlinger :: setParameters
मुझे अब यह पता लग रहा है कि मैं AudioFlinger को कॉल करने के लिए एक साधारण JNI कैसे लिख सकता हूं :: set_arameters with audio_io_handle_t ioHandle, const String8 & keyValuePairs
मुझे पता है कि keyValuePairs क्या हो सकता है, लेकिन ऑडियो_io_handle_t के बारे में कोई सुराग नहीं
अपडेट: मेरा मानना है कि सीएएफ के साथ अन्य ऐप भी क्यूसीओएम ऑडियो का उपयोग कर सकते हैं। उसी के लिंक पर देखें Audio_extn_utils_send_audio_calibration
और voice_get_incall_rec_snd_device उसी के लिंक पर
मुझे कोई C / ++ ज्ञान नहीं है। अगर मैं इन तरीकों को मूल पक्ष से कॉल कर सकता हूं तो मुझे कैसे पता चलेगा? चूंकि अन्य ऐप्स कर सकते हैं, एक तरीका होना चाहिए।
मैं 40 से अधिक दिनों के लिए कम से कम 5-6 घंटे एक दिन से संघर्ष कर रहा हूं। मुझे यकीन नहीं है कि यह एसओ द्वारा अनुमति दी गई है, लेकिन मैं सही उत्तर के लिए दान करने में भी खुश हूं।
मेरे पास एक कॉल रिकॉर्डिंग ऐप है जो VOICE_CALL ऑडियो स्रोत का उपयोग करता है। हालांकि ASOP इसे लागू / शासित नहीं करता है, अधिकांश निर्माताओं ने VOICE_CALL और एप्लिकेशन लागू किए हैं जो VOICE_CALL ऑडियो स्रोत का उपयोग करते हैं, कई उपकरणों पर ठीक काम किया है। यह एंड्रॉइड 6 तक है।
Google ने इस व्यवहार को Android 6 के साथ बदल दिया। VOICE_CALL ऑडियो स्रोत को खोलने के लिए अब android.permission.CAPTURE_AUDIO_OUTPUT की आवश्यकता है जो केवल सिस्टम अनुप्रयोगों के लिए दी गई है।
यह अनिवार्य रूप से कॉल रिकॉर्डिंग को रोकता है, या इसके पास होना चाहिए। खैर, यह 3 के अलावा मेरा और 200+ अन्य कॉल रिकॉर्डिंग ऐप्स के लिए करता है जिन्होंने इस सीमा के आसपास जाने का एक रास्ता खोज लिया है।
मैं एंड्रॉइड 6 के साथ कई अलग-अलग फोन पर उन ऐप की कोशिश कर रहा हूं और उन्हें रिकॉर्ड करने के तरीके में कुछ विशेषताओं का पता चला है।
वे सभी Android AudioRecord वर्ग का उपयोग करते हैं और MIC ऑडियो स्रोत खोलते हैं। मैं भी करता हूँ; लेकिन मेरे ऐप पर, मुझे केवल एमआईसी से ऑडियो मिलता है, दूसरे पक्ष से नहीं। मुझे जो पता चला है वह बता रहा है कि वे रिकॉर्डिंग शुरू करने से ठीक पहले या बाद में किसी तरह का सिस्टम कॉल जारी कर रहे हैं।
निम्नलिखित लॉग फ़ॉर्म में से एक पर एक नज़र डालें जो सफलतापूर्वक VOICE_CALL को रिकॉर्ड करता है, भले ही वह एमआईसी को रिकॉर्ड करने के लिए उपयोग करता है। ऐसा लगता है कि ऐप कुछ ऐसा है जो एमआईसी में VOICE_CALL ऑडियो स्रोत को मिक्स / रूट / स्ट्रीम / मर्ज करने का प्रबंधन करता है।
- 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)
जैसा कि आप पहली पंक्ति में देख सकते हैं कि यह MIC ऑडियो स्रोत input_source = 1 के साथ शुरू हो रहा है; रूटिंग = -2147483644।
इसके बाद, दूसरी पंक्ति में यह कुछ करता है और android.permission प्राप्त करता है। MODIFY_AUDIO_SETTINGS जो सामान्य अनुमति है और मेरे ऐप में भी है। यह सबसे महत्वपूर्ण हिस्सा लगता है और ऐसा लगता है कि सभी 3 JNI का उपयोग करने के लिए कभी भी वे क्या करते हैं, जो कि VOICE_CALL ऑडियो स्रोत को MIC में स्ट्रीम करने / मर्ज करने के लिए करते हैं और standart AudioRecorder API के साथ रिकॉर्ड करते हैं
अगली पंक्ति में आप देखते हैं कि ऑडियो हार्डवेयर VOICE_CALL (input_source = 4) को मिलाना शुरू कर रहा है, भले ही उन्होंने MIC (1) ऑडियो स्रोत खोला हो।
मैंने मान लिया है कि उन्होंने इस्तेमाल किया है
AudioManager.setParameters("key=value")
और कई रूपों की कोशिश की जैसे कि
AudioManager.setParameters("input_source=4;routing=-2147483584;format=1")
बिना किसी भाग्य के।
फिर, मैंने एंड्रॉइड, एनडीके, ऑडियो रूटिंग, हेडसेट के माध्यम से ऑडियो को मजबूर कर दिया है और सोचा कि वे कुछ हो सकते हैं कि कैसे / ऑडियो / मार्ग / धारा / मर्ज करें VOICE_CALL को वर्तमान AudioRecord सत्र में और (क्योंकि कोई सी ज्ञान नहीं है) शोधन का उपयोग करने की कोशिश की। भाग्य के बिना नीचे (फिर से) कोड के साथ एक ही चीज़ को प्राप्त करने के लिए।
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();
}
}
जाहिर है कि मुझे कुछ याद आ रहा है जो रिकॉर्डिंग को संभव बनाता है।
मैंने भी इस जानकारी को प्राप्त करने के लिए भुगतान करने की पेशकश की, सभी ने इनकार कर दिया। काफी मैंने कहा है। मैं इसे एक बार प्रकाशित करूंगा / अगर मुझे मिल जाए तो!
क्या आपके पास कोई विचार है कि वे क्या कर रहे हैं?