当前位置: 首页 > 知识库问答 >
问题:

如何在Android中录制电话

段干子晋
2023-03-14

我需要在我的android应用程序中记录电话。我试过使用MediaRecorder,将AudioSource设置为MIC、VOICE_COMMUNICATION、VOICE_CALL和其他选项。但它们都没有记录通话。有人能建议在android中记录电话的任何解决方案吗?

以下是我试用过的代码。但它不记录通话。只记录通话前后的语音。请建议任何解决方案。

开始录制的代码

public void startRecording(){
            if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {

                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.RECORD_AUDIO}, RECORD_AUDIO);

            } else {
                setReorder();
            }
        }

 public void setReorder(){
        audioManager = (AudioManager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
        audioManager.setMode(AudioManager.MODE_IN_CALL);
        audioManager.setSpeakerphoneOn(true);
        recorder = new MediaRecorder();
//        recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(output_formats[currentFormat]);
//        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setOutputFile(getFilename());
        recorder.setOnErrorListener(errorListener);
        recorder.setOnInfoListener(infoListener);
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            // Do the file write
            prepareAndStart();
        } else {
            // Request permission from the user
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE);
        }
    }

public void prepareAndStart() {
            if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_EXTERNAL_STORAGE);

            } else {
                startRec();
            }


    }

    public void startRec(){
        try{
            recorder.prepare();
            recorder.start();

        } catch (IllegalStateException e) {
            Log.e("REDORDING :: ",e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            Log.e("REDORDING :: ",e.getMessage());
            e.printStackTrace();
        }
    }


//    @SuppressLint("MissingSuperCall")
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 0:
                // Re-attempt file write
                setReorder();
            case 1:
                prepareAndStart();
            case 2:
                startRec();
        }
    }

获取输出文件文件名的代码

    private String getFilename() {
//        String filepath = Environment.getExternalStorageDirectory().getPath();
        String filepath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath();
        File file = new File(filepath, AUDIO_RECORDER_FOLDER);
        Log.d("FILEPATH", filepath);

        if (!file.exists()) {
            file.mkdirs();
            Log.d( "!file.exists","created file");

        }
        Log.d("BEFORE RETURN", "created file EXISTS");
        Log.d("BEFORE RETURN", file.getAbsolutePath());
        return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]);
//        return (file.getAbsolutePath());

    }

停止录制的代码

    public void stopRecording(){
        audioManager.setSpeakerphoneOn(false);

        try{
            if (null != recorder) {
                recorder.stop();
                Log.d("REDORDING STOP :: ", "recorder.stop();");
                recorder.reset();
                Log.d("REDORDING STOP :: ", "recorder.reset();");
                recorder.release();
                Log.d("REDORDING STOP :: ", "recorder.release();");

                recorder = null;
            }
        }catch(RuntimeException stopException){
            Log.e("REDORDING STOP :: ", "RuntimeException stopException");
            Log.e("REDORDING STOP :: ",stopException.getMessage());
            stopException.printStackTrace();
        }
    }

共有2个答案

石喜
2023-03-14

当电话呼叫开始时,麦克风访问将移动到优先级应用程序,即语音呼叫本身及其处理应用程序。如果你的应用是普通应用,则该应用将无法再访问麦克风。但是,如果你的应用具有辅助功能服务,则可以共享麦克风

https://developer.android.com/guide/topics/media/sharing-audio-input

据我所知,<code>VOICE_COMMUNICATION</code>也是一个顶部带有一些滤波器的麦克风,因此在这种情况下,相同的麦克风共享应该可以工作

最后VOICE_CALL 现在事情变得有趣了。此源需要Manifest.permission.CAPTURE_AUDIO_OUTPUT权限。如果你的应用没有,它将崩溃。问题是此权限不会以任何方式提供给第三方应用程序。可访问性技巧在这里不会帮助你。

现在,如果你只是想要一个录音工具,麦克风大部分时间都可以工作,根据情况,你的录音会变得很好或不可收听。如果你不想要越狱机或自定义ROM等,这是唯一可以录制通话的方法。

如果您可以root或自定义ROM设备,那么您可以考虑将应用程序作为系统应用程序安装,以便获得所需的权限。

阎志义
2023-03-14

不幸的是,在大多数非root Android手机上,使用常规应用程序来记录电话是不可能的。

您需要:

A) 使用 OEM 证书对应用进行签名,以获得升级的权限

B)根手机

C) 查找安全漏洞

我认为有一些罕见的模型具有不同的音频路径配置,可以实现这一点,但很少有这样的模型。

 类似资料:
  • 我想做一个应用程序,记录来电和去电,它会自动运行,当用户得到或作出任何呼叫。

  • 我正在开发一个可以在Android系统中记录通话的应用程序。我读过很多讨论通话记录问题的话题。我知道不是所有的Android手机都可以记录通话。但是我想知道如何记录通话,这是游戏市场上最受欢迎的应用程序,比如https://play.google.com/store/apps/details?id=com.appstar.callrecorder或https://play.google.com/s

  • 我正在开发一个内部录音的sip应用程序。我需要双方的音频是在移动本身内部记录器。 阅读有关相同的博客和文章。我知道唯一的解决方案是使用 NDK。经过巨大的努力,我编译并集成了 pjsip/pjsua2 到我的应用程序中,客户端注册和调用可以正常工作。但是,无法记录通话。我尝试过pjsua的音频媒体录像机,但由于没有适当的文档,我什么都不懂。 @Override 公共void onCallMedia

  • 问题内容: 有一些方法可以在Android Wear上录制音频吗?我使用了AudioRecord API,它使应用程序崩溃。 难道我做错了什么? 问题答案: 支持AudioRecord,并且可以在Android Wear上使用。如果要在仿真器上进行测试,则可能是不支持您提供的采样率11025,请尝试另一种,例如8000。 构造AudioRecord之后,您应在尝试记录之前检查状态以确认初始化是否成

  • 假设我有3个模块:mod1、mod2和mod3。 在正常情况下,文件系统层次结构应为: 但我想要的是: 如何在Android Studio 1.1.0中做到这一点? PS:我发现这篇文章,但它似乎不起作用,或者它适用于AS的早期版本,而不是1.1.0:如何在子目录中移动模块?

  • 我的目标是在Android中录制视频,录制时内置秒表。 我遵循了格拉菲卡项目的样本,即CameraCaptureActivity。java,他们使用OpenGL 2.0在录制视频的同时录制一小块。他们正在使用以下代码在OpenGL 2.0中绘制块 上面的代码在录制和保存视频时,在视频的左下角绘制白色块。 我想要的是使用OpenGL 2.0在白色框上绘制文本,这样它也可以与视频一起录制。 我不知道O