精华内容
下载资源
问答
  • Android 手机通话双向录音demo,权限需要自己进行设置,Android 手机通话双向录音demo,权限需要自己进行设置,
  • 本文主要介绍Android 电话自动录音功能的开发,这里提供实现代码和实现效果图,有需要的小伙伴可以参考下
  • /*** Created by Easzz on 2015/12/6.*/public class RecorderService extendsService {private MediaRecorder... //录音的一个实例@OverridepublicIBinder onBind(Intent intent) {return null;}@Overridepublic vo...

    /*** Created by Easzz on 2015/12/6.*/

    public class RecorderService extendsService {private MediaRecorder recorder; //录音的一个实例

    @OverridepublicIBinder onBind(Intent intent) {return null;

    }

    @Overridepublic voidonCreate() {super.onCreate();//获得电话管理器

    TelephonyManager tm=(TelephonyManager) getSystemService(TELEPHONY_SERVICE);//启动监听.传入一个listener和监听的事件,

    tm.listen(newMyListener(),PhoneStateListener.LISTEN_CALL_STATE);

    }class MyListener extendsPhoneStateListener{//在电话状态改变的时候调用

    @Overridepublic void onCallStateChanged(intstate, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);switch(state){caseTelephonyManager.CALL_STATE_IDLE://空闲状态

    if (recorder!=null){

    recorder.stop();//停止录音

    recorder.release();//释放资源

    recorder=null;

    }break;caseTelephonyManager.CALL_STATE_RINGING://响铃状态 需要在响铃状态的时候初始化录音服务

    if (recorder==null){

    recorder=new MediaRecorder();//初始化录音对象

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置录音的输入源(麦克)

    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置音频格式(3gp)

    createRecorderFile();//创建保存录音的文件夹

    recorder.setOutputFile("sdcard/recorder" + "/" + getCurrentTime() + ".3gp"); //设置录音保存的文件

    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码

    try{

    recorder.prepare();//准备录音

    } catch(IOException e) {

    e.printStackTrace();

    }

    }break;caseTelephonyManager.CALL_STATE_OFFHOOK://摘机状态(接听)

    if (recorder!=null){

    recorder.start();//接听的时候开始录音

    }break;

    }

    }//创建保存录音的目录

    private voidcreateRecorderFile() {

    String absolutePath=Environment.getExternalStorageDirectory().getAbsolutePath();

    String filePath=absolutePath+"/recorder";

    File file=newFile(filePath);if (!file.exists()){

    file.mkdir();

    }

    }//获取当前时间,以其为名来保存录音

    privateString getCurrentTime(){

    SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");

    Date date=newDate();

    String str=format.format(date);returnstr;

    }

    }

    }

    展开全文
  • 一、问题描述  使用BordercastReceiver和Service组件实现下述功能: 1.当手机处于来电状态,启动监听服务,对... Android没有对外公开结束通话的API,要结束通话就必须使用AIDL与电话管理服务进行通信,并调用服务中的
  • 主要介绍了Android编程检测手机录音权限是否打开的方法,涉及Android针对音频操作的相关技巧与注意事项,需要的朋友可以参考下
  • Android 通话双向录音
  • Android 通话双向录音

    2015-11-24 18:07:20
    对于Android开发,打电话双向录音的解决方案。
  • android实现通话录音获取上传实现过程记录。

    千次阅读 热门讨论 2019-07-24 18:23:33
    项目里提了一个需求,需要通话录音功能(录制双方的声音),并上传到后台。(软件是内部人员工作使用不涉及个人隐私) 首先想到的肯定是用APP来进行录音,可控性比较高,测试了android自带的MediaRecorder与AudioRecord...

    项目里提了一个需求,需要通话录音功能(录制双方的声音),并上传到后台。(软件是内部人员工作使用不涉及个人隐私)

    首先想到的肯定是用APP来进行录音,可控性比较高,测试了android自带的MediaRecorder与AudioRecord结果发现都只能录到呼叫方的声音,查找资料发现录音的来源中有一个MediaRecorder.AudioSource.VOICE_CALL可以录制双方声音,不过5.1以后已经被修改为系统应用才可以使用。

    嗯....爆炸

    然后发现一款叫ec的软件号称可以实现双方录音并上传。(拥有企鹅投资的公司应该比较牛)

    赶紧下载下来体验一下,发现第一次在软件内拨打电话会提示去开启通话录音功能,点击去开启的话就会跳转到拨号界面。

    然后我没开 直接测试打电话,挂断,在列表里查看,没有发现录音文件,然后问客服,客服说要手动打开手机的通话的自动录音功能。

    emmm 这这这 好吧 手动去打开了通话自动录音功能,再测试,确实会有录音文件出现在列表。

    分析一下这个实现原理,录音是靠手机自动的通话录音,然后找到这个录音文件上传。(这也太敷衍了,不过既然这大公司也只能用这种方案,估计就没有其他好的方案了。)

    那我们也按照他的实现方式来做。

    首先想到有没有系统api可以检测通话录音功能是否打开呢?

    emmm 这个目前网上也没找到有相关文章介绍可以通过系统的api去检测的,所以走系统api检查的方案不可行。

    既然没有api可以检测那只能找其它途径了,突然想到是否可以从有录音文件这个方向入手呢,嗯 好像还不错,如果通话结束后有录音文件那就是开了通话录音功能,没有就是没开。

    那么问题又来了,这个录音文件该怎么找它的路径呢?

    因为不会逆向没办法看ec的实现方案,那就自己想,是不是可以通过固定的文件目录来找到这个文件呢?

    开始测试

    第一次用华为的nova3 开了通话录音然后去查看文件的目录发现是在根目录/Sounds/CallRecord/目录下

    第二次用华为的荣耀畅玩6开了通话录音然后去查看文件的目录发现是在根目录/record/目录下

    emmm 同一个厂家不同型号的存储位置都不一样 那不得一台一台去判断了?而且一台台适配的话,手机资源也没这么多(没钱)。这个方案不行。(当然ec是可以做到的,毕竟有企鹅投资,资金不是问题)

    那继续观察,咦 发现一个点 录音文件名后面都会包含一个日期 格式年月日时分秒(yyyyMMddHHmmss)

    这样是不是肯定可以这个去适配呢?

    但是又有一个问题怎么让这个文件名的时间跟这通电话关联起来呢?

    发现通话记录表有个CallLog.Calls.DATE字段是long类型。那这个时间是不是跟文件名有关联呢?

    继续测试

    拿华为的nova3与荣耀畅玩6 读取拨打结束对应号码的date字段转换成yyyyMMddHHmmss格式与录音文件对比发现

    竟然是一致的,那不就可以拿这个时间去匹配对应的文件了?(高兴了一波,事实证明没这么简单)

    然后我又拿了一台vivo手机去测试,结果发现录音文件名后面的日期格式变成了(yyyy-MM-dd HH-mm-ss) 

    而且读取的通话记录里的data字段转换过来跟录音文件名后面的日期也对应不上。FU

    emmm,方案又失败了(跟前面一样需要一台台适配)

    极端方案(目前项目里使用的能比较大程度上保证获取准确的录音文件,目前不能说100%吧)

    首先知道录音文件的后缀名,一般是.amr .wav .aac .mp3 当然这些只是主流的 不排除一些特别的,所以最好做成后台配置规则的方式去处理。

    然后去扫描SD卡所有文件,由于全部扫描非常耗时,所以目录也做了相应的匹配规则(例如包含RECORD,SOUND,录音),也做成后台配置。

    public static List<File> searchFiles(File folder) {
        List<File> result = new ArrayList<>();
        if (folder.isFile())
            result.add(folder);
        File[] subFolders = folder.listFiles(new FileFilter() {
            @Override
            public boolean accept(File file) {
                if (file.isDirectory()&&checkFileName(file.getName())) {
                    return true;
                }
                if (checkFileNameEnd(file.getName())) {
                    return true;
                }
                return false;
            }
        });
        if (subFolders != null) {
            for (File file : subFolders) {
                if (file.isFile()) {
                    // 如果是文件则将文件添加到结果列表中
                    result.add(file);
                } else {
                    // 如果是文件夹,则递归调用本方法,然后把所有的文件加到结果列表中
                    result.addAll(searchFiles(file));
                }
            }
        }
        return result;
    }
    //匹配目录规则
    private static boolean checkFileName(String name){
        String[] rule=App.getApp().getFileNameRule().split(",");
        for (String string:rule){
            if(name.toUpperCase().contains(string)){
                return true;
            }
        }
       return false;
    }
    //匹配后缀规则
    private static boolean checkFileNameEnd(String name){
        String[] rule=App.getApp().getFileNameEndRule().split(",");
        for (String string:rule){
            if(name.toLowerCase().contains(string)){
                return true;
            }
        }
        return false;
    }

    从上面的函数中获取到了符合规则的文件列表然后,获取修改时间是最新的文件。

    //获取修改时间是最新的文件
    public static File getLastFile(List<File> files){
        File myfile=null;
        long fileTime=0;
        for (File file:files){
            if(file.lastModified()>fileTime){
                myfile=file;
                fileTime=file.lastModified();
            }
        }
        return myfile;
    }

    然后还要检测这个文件跟目前这个通话的时间上不能差距太大,我发现vivo的通话记录的date跟录音文件名后面的日期大概差了0-20s左右不固定,所以写了个一分钟的区间。当然你可以根据更多的测试去把这个区间调的更加准确。

    然后在项目中监听通话状态挂断的时候可以保存一个时间戳,用保存的时间戳与前面获取到的文件的最后修改时间进行比较,测试发现误差在1秒左右,为了防止可能卡顿的情况所以给个5秒应该算是比较精确的了。

    //检测这个文件是否符合要求
    //time是从监听通话挂断时记录的时间戳。
    public static boolean checkFile(File file,long time){
        return Math.abs(time-file.lastModified())<5*1000;
    }
    

    这样大部分都可以兼容了,目录与后缀名规则可以在测试过程中通过后台不断添加完善。

     

    展开全文
  • Android通话录音

    千次阅读 2020-11-05 16:30:04
    最近一个需求,要求通话保证双向录音。...一:首先让用户去拨打电话设置页面-打开所有通话录音 二:让用户在拨打出电话后,点击功能,然后录音 然后我们根据各个手机厂商录音文件夹下找相关录音

    最近一个需求,要求通话保证双向录音。目前相关文章比较少,于是去调研了相关的一些软件。唉~果然,又是一个不好做的坑位。IOS直接没法做。先说一下,如果用户不手动打开录音,只能简单的录单边。所以有类似需求的,不要想太多,这个侵犯隐私的未来会跟IOS一样彻底封禁。

    先说一下我的思路,既然一般方案不行,那就换个角度去想问题。首先我们先说关于用户手动打开录音功能:

    一:首先让用户去拨打电话设置页面-打开所有通话录音

    二:让用户在拨打出电话后,点击功能,然后录音

    然后我们根据各个手机厂商录音文件夹下找相关录音文件,所有的录音文件是包含你拨打的手机号的。相关代码:

    public class AotuVoiceFileUtils {
        static List<String> pathList = new ArrayList<>();
    
        public static File pathFile() {
            String parentPath = Environment.getExternalStorageDirectory().getAbsolutePath();
            File childFile = null;
            if (DeviceUtils.getDeviceManufacturer().equals("HUAWEI") || DeviceUtils.getDeviceManufacturer().equals("HONOR")) {
                if (FileUtils.isExist(parentPath + "/Sounds/CallRecord")) {
                    childFile = new File(parentPath + "/Sounds/CallRecord");
                } else if (FileUtils.isExist(parentPath + "/record")) {
                    childFile = new File(parentPath + "record");
                } else if (FileUtils.isExist(parentPath + "/Record")) {
                    childFile = new File(parentPath + "/Record");
                } else {
                    childFile = new File("");
                }
    
            } else if (DeviceUtils.getDeviceManufacturer().equals("XIAOMI")) {
                childFile = new File(parentPath + "/MIUI/sound_recorder/call_rec/");
            } else if (DeviceUtils.getDeviceManufacturer().equals("MEIZU")) {
                childFile = new File(parentPath + "/Recorder");
            } else if (DeviceUtils.getDeviceManufacturer().equals("OPPO")) {
                childFile = new File(parentPath + "/Recordings");
            } else if (DeviceUtils.getDeviceManufacturer().equals("VIVO")) {
                childFile = new File(parentPath + "/Record/Call");
            } else if (DeviceUtils.getDeviceManufacturer().equals("SAMSUNG")) {
                childFile = new File(parentPath + "/Sounds");
            } else {
                childFile = new File("");
            }
            return childFile;
        }
    
        /*传入拨打的电话号码做匹配*/
        public static String getPathList(String phone) {
            ArrayList<String> result = new ArrayList<>();
            File[] files = pathFile().listFiles();
            if (files == null) {
                return "";
            }
            for (int i = 0; i < files.length; i++) {
                if (!files[i].isDirectory()) {
                    String fileName = files[i].getName();
                    if (fileName.trim().toLowerCase().contains(phone)) {
                        result.add(fileName);
                    }
                }
            }
    
            return result.isEmpty() ? "" : result.get(0);
        }
    }

    业务需求,我只需要获取最新的录音文件就可以上传给后台。

    如果用户不手动打开系统录音文件,那怎么办呢?害~只能我们录单边的音,因为现在的Android系统,已经做了很多安全设施,包括5.1声道,所以,你只要有一个其他进程占用录音的话筒,那其他的进程就不能使用(除非你是系统的软件,要成为系统软件那你得定制手机,跟设备厂商合作了)。所以我们只能录自己说话的。自己的怎么录呢?主要是开一个service,然后监听通话:

         TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
            tm.listen(new MyRecordListener(), PhoneStateListener.LISTEN_CALL_STATE);//监听电话状态
     class MyRecordListener extends PhoneStateListener {
            @Override
            public void onCallStateChanged(int state, String phoneNumber) {
                Log.d("TAG1", "空闲状态" + phoneNumber);
                switch (state) {
                    case TelephonyManager.CALL_STATE_IDLE:
                        Log.d("TAG1", "空闲");
                        if (isRecording && mediaRecordingUtils != null) {
                            mediaRecordingUtils.stopRecord();
    
                        }
                        isRecording = false;
                        break;
                    case TelephonyManager.CALL_STATE_RINGING:
                        Log.d("TAG1", "来电响铃");
                        // 进行初始化
    
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK:
                        Log.d("TAG1", "摘机" + (!phoneNumber.equals("") ? phoneNumber : ""));
                        File directory_doc = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
                        //判断当前是否有这个文件夹。
                        FileUtils.newDirectory(directory_doc.getPath(), "dudu");
                        String voiceName = phoneNumber+System.currentTimeMillis() + "";
                        // 开始录音
                        mediaRecordingUtils = new MediaRecordingUtils(directory_doc.getPath() + "/dudu/" + voiceName + ".mp3");
                        Paper.book().write("voicePath", directory_doc.getPath() + "/dudu/" + voiceName + ".mp3");
                        mediaRecordingUtils.setOnAudioStatusUpdateListener(new MediaRecordingUtils.OnAudioStatusUpdateListener() {
                            @Override
                            public void onUpdate(double db, long time) {
    
                                Log.e("TAG", "initView: ================================>>>>>分贝=" + db + "=时长=" + time);
                            }
    
                            @Override
                            public void onStop(String filePath) {
                                Log.e("TAG", "initView: ================================>>>>>路径=" + filePath);
                            }
                        });
                        mediaRecordingUtils.startRecord();
                        isRecording = true;
                    default:
                        break;
                }
    
                super.onCallStateChanged(state, phoneNumber);
            }
        }

    录音的功能,我用的MediaRecorder,因为这个输出格式ACC的文件,你只需要输出文件后缀改成.mp3,它就是mp3的音乐,可以直接播放,当然,你有其他需求可以格式,你可以输出其他的。

    public class MediaRecordingUtils {
    
        //文件路径
        private String filePath;
    
        private MediaRecorder mMediaRecorder;
        private final String TAG = "fan";
        public static final int MAX_LENGTH = 1000 * 60 * 200;// 最大录音时长,单位毫秒,1000*60*10;
    
        private OnAudioStatusUpdateListener audioStatusUpdateListener;
    
        /**
         * 文件存储默认sdcard/record
         */
        public MediaRecordingUtils() {
        }
    
        public MediaRecordingUtils(String filePath) {
            this.filePath=filePath;
    //        File path = new File(filePath);
    //        if (!path.exists())
    //            path.mkdirs();
    //        this.FolderPath = filePath;
        }
    
        private long startTime;
        private long endTime;
    
    
        /**
         * 开始录音 使用aac格式
         * 录音文件
         *
         * @return
         */
        public void startRecord() {
            // 开始录音
            /* ①Initial:实例化MediaRecorder对象 */
            if (mMediaRecorder == null)
                mMediaRecorder = new MediaRecorder();
            try {
                /* ②setAudioSource/setVedioSource */
                mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
                /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
                mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
                /*
                 * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
                 * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
                 */
                mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    
                /* ③准备 */
                mMediaRecorder.setOutputFile(filePath);
                mMediaRecorder.setMaxDuration(MAX_LENGTH);
                mMediaRecorder.prepare();
                /* ④开始 */
                mMediaRecorder.start();
                // AudioRecord audioRecord.
                /* 获取开始时间* */
                startTime = System.currentTimeMillis();
                updateMicStatus();
                Log.e("TAG", "startRecord: ======= startTime" + startTime );
            } catch (IllegalStateException e) {
                Log.e("TAG", "startRecord: ======= call startAmr(File mRecAudioFile) failed!" + e.getMessage());
            } catch (IOException e) {
                Log.e("TAG", "startRecord: ======= call startAmr(File mRecAudioFile) failed!" + e.getMessage() );
            }
        }
    
        /**
         * 停止录音
         */
        public long stopRecord() {
            if (mMediaRecorder == null)
                return 0L;
            endTime = System.currentTimeMillis();
    
            //有一些网友反应在5.0以上在调用stop的时候会报错,翻阅了一下谷歌文档发现上面确实写的有可能会报错的情况,捕获异常清理一下就行了,感谢大家反馈!
            try {
                mMediaRecorder.stop();
                mMediaRecorder.reset();
                mMediaRecorder.release();
                mMediaRecorder = null;
    
                audioStatusUpdateListener.onStop(filePath);
                filePath = "";
    
            } catch (RuntimeException e) {
                try {
                    mMediaRecorder.reset();
                    mMediaRecorder.release();
                    mMediaRecorder = null;
    
                    File file = new File(filePath);
                    if (file.exists())
                        file.delete();
    
                    filePath = "";
                } catch (Exception e1) {
    
                }
    
            }
            return endTime - startTime;
        }
    
        /**
         * 取消录音
         */
        public void cancelRecord() {
    
            try {
    
                mMediaRecorder.stop();
                mMediaRecorder.reset();
                mMediaRecorder.release();
                mMediaRecorder = null;
    
            } catch (RuntimeException e) {
                mMediaRecorder.reset();
                mMediaRecorder.release();
                mMediaRecorder = null;
            }
            File file = new File(filePath);
            if (file.exists())
                file.delete();
    
            filePath = "";
    
        }
    
        private final Handler mHandler = new Handler();
        private Runnable mUpdateMicStatusTimer = new Runnable() {
            public void run() {
                updateMicStatus();
            }
        };
    
    
        private int BASE = 1;
        private int SPACE = 100;// 间隔取样时间
    
        public void setOnAudioStatusUpdateListener(OnAudioStatusUpdateListener audioStatusUpdateListener) {
            this.audioStatusUpdateListener = audioStatusUpdateListener;
        }
    
        /**
         * 更新麦克状态
         */
        private void updateMicStatus() {
    
            if (mMediaRecorder != null) {
                double ratio = (double) mMediaRecorder.getMaxAmplitude() / BASE;
                double db = 0;// 分贝
                if (ratio > 1) {
                    db = 20 * Math.log10(ratio);
                    if (null != audioStatusUpdateListener) {
                        audioStatusUpdateListener.onUpdate(db, System.currentTimeMillis() - startTime);
                    }
                }
                mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);
            }
        }
    
        public String getFilePath() {
            return filePath;
        }
    
        public interface OnAudioStatusUpdateListener {
            /**
             * 录音中...
             *
             * @param db   当前声音分贝
             * @param time 录音时长
             */
            public void onUpdate(double db, long time);
    
            /**
             * 停止录音
             *
             * @param filePath 保存路径
             */
            public void onStop(String filePath);
        }
    
    }
    

    这段代码使用的别人写好的,如果有侵权,请联系我删除。

    然后就完成了单边录音。保存在手机Documents文件夹下dudu下。我采用的命名为手机号+当前时间戳。

    然后我们在上传给后台的时候先判断当前本地有没有系统录音的文件,如果没有就采用自己录的单边的。记得,每次上传完成后要把当前存下来的录音文件删除,避免占用过大内存。最最最重要的是,每次录音的运行时权限一定别忘了,要不然程序GG。

     

     

     

    展开全文
  • Android如何获取手机通话记录,本文为大家揭晓。 获取手机通话记录流程: 1、 获取ContentResolver; ContentResolver resolver = getContentResolver(); 2、resolver.query(*); 需要传入通话记录的URI:...
  • Android调用手机系统自带录音功能实现语音录制与播放
  • 本文介绍了Android实现录音的实例代码(MediaRecorder),分享给大家,具体如下: Android提供了两个API用于录音的实现:MediaRecorder 和 AudioRecord,各有优劣。 1、MediaRecorder 已经集成了录音、编码、压缩等...
  • 打开“启用”开关,如图所示 4 然后会看到此插件的开发者对于电话录音的法律提示,同意的话请点击“同意”按钮,如图所示 5 当启用了录音,并同意插件的关于法律条款协议以后,就可以对通话进行录音了。另外还有一个...

    第一步、安装 Audio Recorder

    1

    这里以 iOS7 为例,这是一款越狱插件,所以事先得把自己手头上的 iOS7 越狱了。打开主屏上的 Cydia 越狱应用商店以后,点击底部的“搜索”栏目,如图所示

    2

    在搜索框中输入 Audio Rrecorder 关键字,点击列表中出现的 Audio Recorder 插件,如图所示

    注:如果没有搜索出来的话,可以尝试添加 178 的软件源后,再搜索。

    3

    对于 iOS7 和 iPhone5s ,在这个插件的详情页面中,请认准版号和支持的系统。图中方框标识为版本号和所支持的系统。点击右上角的“安装”按钮继续,如图所示

    4

    继续点击右上角的“确认”按钮开始安装,如图所示

    5

    等待系统下载插件并安装好以后,点击底部的“重启 SpringBoard”按钮,如图所示

    END

    第二步、设置 Audio Recorder

    1

    当安装重启完成以后,解锁回到桌面以后,会看到 Audio Recorder 提示我们可以在设置中设置它的选项,点击“OK”继续,如图所示

    2

    接下来我们在手机的设置列表中,找到 Audio Recorder 选项,如图所示

    3

    随后在 Audio Recorder 的设置选项中,打开“启用”开关,如图所示

    4

    然后会看到此插件的开发者对于电话录音的法律提示,同意的话请点击“同意”按钮,如图所示

    5

    当启用了录音,并同意插件的关于法律条款协议以后,就可以对通话进行录音了。另外还有一个设置选项可以看看,就是录音的方式。一共有四种,这里我们以手动为例,如图所示

    END

    第三步、尝试录音

    接下来我们可以找一个朋友,在征求别人同意的情况下,尝试一下录音。可以看到在通话界面的左上方有一个录音按钮,点击它就可以录音了,如图所示

    当在为当前通话录音时,可以看到此图标有 Rec 字样并闪烁,如图所示

    通话结束以后,接下来就是要找我们刚刚的录音了。在主屏上找到 Audio Recorder 的应用图标,如图所示

    在 Audio Recorder 中,通话录音分为三个类,

    一是,All全部录音,包括来电,打出去的。

    二是,incoming 来电,别人打进来的。

    三是,outgoing自己打出去的。

    找到自己刚刚的录音,就可以播放了。

    5

    另外,通话录音可以通过邮件转移,同样地这个也涉及到法律,请大家在使用时要慎重

    亲 回答不易 有疑问请 没疑问请采纳

    取消

    评论

    展开全文
  • android 通话录音

    千次阅读 2018-11-02 17:50:15
    最近需要做一个类似于电话...监听手机通话状态 在监听到接听时开始录音,结束停止录音。   public abstract class CommonAdapter&lt;T&gt; extends BaseAdapter{  protected Context mContext;  pr...
  • Android手机通话录音实现

    千次阅读 2015-03-19 16:48:36
    最近在做语音IVR的时候需要对通话进行录音,主要用到了MediaRecorder类,实现代码如下: MediaRecorder mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder....
  • android实现通话录音

    热门讨论 2014-03-06 11:07:59
    android实现通话录音功能,录音结果保存在SD卡中,通话结束自动播放本次通话。项目完整,可直接在真机上运行
  • android 通话自动录音服务

    千次阅读 2017-02-25 14:48:43
    需求: ①:通话自动录音; ②:无界面,只是一个service;...启动一个service,监听用户手机通话状态,当检测到用户处于通话状态下,立即开始录音通话结束后,停止录音,并保存文件。 此功能的前提条件:
  • 主要介绍了Android编程实现通话录音功能的方法,结合实例形式较为详细的分析了Android广播接收机制实现录音功能的操作技巧,需要的朋友可以参考下
  • 我正在使用自动呼叫记录器应用程序,我能够使用...我设法使用MediaRecorder.AudioSource.MIC进行录音,但这里传入的声音没有录制,我想在正常模式下录制语音通话,而不是在扬声器模式下录制。请帮帮我。 (我曾尝试过...
  • android10及以上通话录音 android10通话录音时,录音时静音解决办法 1.添加辅助功能 2.
  • Android 通话录音功能

    千次阅读 2021-05-20 17:41:23
    通话录音功能因为涉及隐私问题,Android 6.0上就移除官方的通话录音接口,只能通过其他方式去获取调用。 录音时需要设置音频类型,系统中定义以下几种 (MediaRecorder.AudioSource) CAMCORDER 录音来源于同...
  • 此demo是用来开启蓝牙耳机的Sco模式,进而行录音,然后保存到手机sd卡中的。
  • android电话录音

    2019-08-03 01:11:20
    NULL 博文链接:https://kevindan.iteye.com/blog/1991210
  • android 通话双向录音

    2017-02-27 08:31:19
    最近研究一款通话录音,网上找了好多源码要不就是单向的mic,要不就是voice_call被禁用,大多数都是基于mediarecoder开发的,我最后反编译了一款apk,发现里面用的是audiorecord开发的,下面附上我成功的案例:
  • 主要介绍了Android6.0编程实现双向通话自动录音功能的方法,结合实例形式分析了Android录音功能的原理、实现技巧与相关注意事项,需要的朋友可以参考下
  • 本项目是android手机客户端通过调用系统录音机或者选择现有录音文件,实现录音文件上传,包括android手机客户端和web服务器。且直接导入到eclipse就可运行。
  • 实现视频通话源代码。 android 通话录音实现。 因受系统限制,只能录自已麦的声音,录不到对方的声音,可能需要改内核才能实现双向录音

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,053
精华内容 3,621
关键字:

android手机通话录音