相关疑难解决方法(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
查看次数

使用反射设置对象属性

我按名称获取类,我需要使用相应的数据更新它们,我的问题是如何使用java我想要添加方法一些虚拟数据.我不知道类类型我只是获取类名并使用反射来获取他的数据

我使用此代码来获取类实例和

Class<?> classHandle = Class.forName(className);

Object myObject = classHandle.newInstance();

// iterate through all the methods declared by the class
for (Method method : classHandle.getMethods()) {
    // find all the set methods
    if (method.getName().matches("set[A-Z].*")
Run Code Online (Sandbox Code Playgroud)

并且知道我找到了我想用数据更新它的set方法的列表我该怎么做.

假设在类名中我得到了人,而且类有setSalary和setFirstName等我怎样才能用反射设置它们?

public class Person {

    public void setSalery(double salery) {
        this.salery = salery;
    }

    public void setFirstName(String FirstName) {
        this.FirstName = FirstName;
    }   
}
Run Code Online (Sandbox Code Playgroud)

java reflection accessor

25
推荐指数
2
解决办法
7万
查看次数

Android通话录音未录制来电语音

我正在使用自动呼叫记录器应用程序,我能够在android 6下面使用记录语音呼叫MediaRecorder.AudioSource.VOICE_CALL,从android 6无法使用VOICE_CALL记录语音呼叫.我设法录音使用,MediaRecorder.AudioSource.MIC但这里传入的声音没有被记录,我想在正常模式下录制语音通话,而不是在扬声器模式下.请帮帮我.(我曾尝试过Xiomi Redmi 4a(机器人6),没有工作).

 myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
 myRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
 myRecorder.setMaxDuration(60 * 60 * 1000);
 AudioManager audiomanager =
 (AudioManager)getSystemService(AUDIO_SERVICE);
 audiomanager.setMode(2);
Run Code Online (Sandbox Code Playgroud)

编辑:权限没有问题.

更新:任何人都知道如何强制另一个流到MIC音频源.这需要原生的android代码.请帮我解决此 问题.有关路由音频的详细信息,请参阅此问题

android native phone-call android-ndk android-mediarecorder

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

Android - 如何获取AudioManager/AudioSystem参数列表

AudioManager有一个setParameters方法,它接受字符串表示中的键值对("parameter_name = parameter_value").
在内部,它称为原生AudioSystem.setParameters.
获取参数值的唯一方法是,如果你知道它的名字,可以调用AudioManager.getParameters调用`AudioSystem'中相应的本机方法的方法.

有没有办法(使用反射或其他技术)获得支持的参数列表(当然结果将取决于它被调用的设备,因为它是特定于平台的)?

android android-audiomanager

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

android以pcm获取设备整体音频输出

有没有办法拦截或只是读取Android设备中的音频输出?

我需要从myActivity内部读取PCM中的整个音频输出,包括背景中的媒体播放器应用,来自呼叫的语音,myACtivity内的MediaPlayer等等,以及扬声器播放的所有内容.实际上,如果可以单独阅读它们,也会很棒.

我试着用AudioRecord,给它作为参数的AudioSource每不断发现MediaRecorder.AudioSource没有运气,我应该尝试不同的audioSources?

它是一个如此低级别的任务,必须在本机层内处理?

android android-audiorecord

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

Android音频捕获静音检测

我发现这个Android代码在他/她开始讲话时记录用户声音并在他/她停止时停止录制.但问题是录音停止很快.如果想说两个单词,它只记录第一个单词.

如何更改以下代码以使录制过程对瞬间沉默不那么敏感?

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final int RECORDER_BPP = 16;
    int RECORDER_SAMPLERATE = 8000;
    int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
    int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

    // Get the minimum buffer size required for the successful creation of
    // an AudioRecord object.
    int bufferSizeInBytes = AudioRecord
            .getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS,
                    RECORDER_AUDIO_ENCODING);
    // Initialize Audio Recorder.
    AudioRecord audioRecorder = new AudioRecord(
            MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE,
            RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, bufferSizeInBytes);
    // Start Recording.
    audioRecorder.startRecording();

    int numberOfReadBytes = 0;
    byte audioBuffer[] = new byte[bufferSizeInBytes];
    boolean recording = false; …
Run Code Online (Sandbox Code Playgroud)

java android

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