`

Android 手机录音功能实现

 
阅读更多
package org.homeway.phonerecorder;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.telephony.TelephonyManager;
import android.util.Log;

import java.io.File;
import java.io.IOException;

/**
 * Created by Administrator on 15-2-27.
 */
public class PhoneBroadcastReceiver extends BroadcastReceiver {

    // 本机拨出的电话号码
    private static String outgoingNumber;
    // 来电的电话号码
    private static String incomingNumber;
    // 系统录音机
    private static MediaRecorder mediaRecorder;

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.d("PhoneBroadcastReceiver", "intent.getAction() = " + action);
        // 如果是去电, 获取拨出的电话号码
        if (action.equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
            outgoingNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            Log.d("PhoneBroadcastReceiver", "outgoingNumber = " + outgoingNumber);
        } else if (action.equals("android.intent.action.PHONE_STATE")) {
            TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
            int phoneState = tm.getCallState();
            Log.d("PhoneBroadcastReceiver", "phoneState = " + phoneState);
            switch (phoneState) {
                case TelephonyManager.CALL_STATE_RINGING:
                    incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                    Log.d("PhoneBroadcastReceiver", "incomingNumber = " + incomingNumber);
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    new Thread(){
                        @Override
                        public void run() {
                            File dirFile = Environment.getExternalStorageDirectory();
                            File file;
                            if (null != incomingNumber && incomingNumber.length() > 0) {
                                file = new File(dirFile, "IN_" + incomingNumber + "_" + System.currentTimeMillis() + ".amr");
                            } else {
                                file = new File(dirFile, "OUT_" + outgoingNumber + "_" + System.currentTimeMillis() + ".amr");
                            }
                            mediaRecorder = new MediaRecorder();
//                            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
                            /**
                             * !!! 红米note必须设置为VOICE_CALL才能收到声音.设置为其他类型时, 录音文件在播放时无声音.
                             * !!! coolpad手机在设置为VOICE_CALL时, 执行mediaRecorder.start()时抛出异常. 若设置为DEFAULT或MIC时则程序正确执行.
                             */
//                            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
                            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
                            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                            mediaRecorder.setOutputFile(file.getAbsolutePath());
                            try {
                                mediaRecorder.prepare();
                                mediaRecorder.start();
                                Log.d("PhoneBroadcastReceiver", "record file path = " + file.getAbsolutePath());
                            } catch (IOException e) {
                                e.printStackTrace();
                                Log.e("PhoneBroadcastReceiver", e.getMessage());
                                mediaRecorder = null;
                            } catch (Exception e) {
                                e.printStackTrace();
                                Log.e("PhoneBroadcastReceiver", e.getMessage());
                                mediaRecorder = null;
                            }
                        }
                    }.start();
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    if (null != mediaRecorder) {
                        mediaRecorder.stop();
                        mediaRecorder.reset();
                        mediaRecorder.release();
                        mediaRecorder = null;
                        incomingNumber = null;
                        outgoingNumber = null;
                    }
                    Log.d("PhoneBroadcastReceiver", "finished!");
                    break;
            }
        }
    }
}

 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.homeway.phonerecorder" >

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".PhoneBroadcastReceiver">
            <intent-filter>
                <!-- 获取来电广播 -->
                <action android:name="android.intent.action.PHONE_STATE"/>
                <!-- 获取去电广播 -->
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

 

分享到:
评论

相关推荐

    android实现通话录音功能

    在Android平台上实现通话录音功能是一项技术挑战,但也是许多应用程序开发者需要掌握的关键技能。这篇文章将深入探讨如何在Android系统中实现实时通话录音,并提供相关的源码参考。 首先,了解Android权限管理至关...

    Android实现录音完整代码

    本文将深入探讨如何使用Android的MediaRecorder类实现录音功能,并通过MediaPlayer类播放录制的音频资源。我们将详细讲解相关的API用法,以及在实际开发中需要注意的关键点。 **一、Android录音** 1. **...

    Android 实现电话来去自动录音的功能

    以下是一个简单的录音功能实现: ```java private MediaRecorder mediaRecorder; public void startRecording(String filePath) { mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource...

    基于Android平台下的通话录音软件,帮助用户轻松实现通话录音和留言录音

    在Android系统中,录音功能需要申请`RECORD_AUDIO`权限。从Android 6.0(API级别23)开始,应用需要在运行时请求敏感权限,包括录音权限。因此,开发者需要在代码中处理权限请求流程,确保用户同意授权才能进行录音...

    Android调用手机系统自带录音功能实现语音录制与播放

    在Android平台上,开发人员可以利用系统内置的录音功能来实现语音录制与播放的应用。这个过程主要涉及以下几个关键知识点: 1. **MediaRecorder类**:Android系统提供了`MediaRecorder`类,它是实现音频、视频录制...

    Android仿微信录音功能

    在Android平台上,仿照微信实现录音功能涉及到一系列的步骤和技术要点。微信的录音体验非常流畅,包括一键录音、拖动选择长度以及清晰的音质,这些都是我们需要关注的关键点。以下将详细阐述如何在Android应用中实现...

    android录音机带录音波形及播放波形

    首先,录音功能是通过Android的MediaRecorder类来实现的。MediaRecorder是一个用于捕获多媒体数据的类,它可以用来录制音频或视频。在录音机应用中,我们需要设置其音频源(如AudioSource.MIC),编码格式(如...

    Android录音的声波动画

    Android提供了一个名为AudioRecord的API,用于实现录音功能。AudioRecord类允许开发者读取原始音频数据流,并将其保存到文件。在声波动画示例中,可能通过设置适当的音频格式(如采样率、位深度和通道数)来初始化...

    基于android手机录音器的设计与实现(代码和报告)

    这次课题的目的是在Android系统的手机开发平台之上,研究与开发一个录音软件,提供适用手机的录音功能服务。 首先,录音的基本功能就是录音,手机用户首先用到的就是录制音频,输入信息以音频的形式展现出来,存储...

    android录音demo代码

    在Android平台上,录音功能是通过Android SDK中的MediaRecorder类实现的。这个`android录音demo代码`可能是一个简单的示例程序,旨在帮助开发者了解如何在Android应用中集成录音功能。下面我们将详细探讨Android录音...

    html5+js实现手机录音功能,支持微信等80%的浏览器内核

    支持大部分已实现getUserMedia的浏览器,包括腾讯Android X5内核(QQ、微信)。 录音默认输出mp3格式,另外可选wav格式(此格式录音文件超大);有限支持ogg(beta)、webm(beta)格式;支持任意格式扩展(前提有相应...

    Android 手机通话录音demo

    10. **隐私政策与法规**:请注意,不同国家和地区对于电话录音可能有不同的法律法规,确保你的应用遵循当地的规定,并明确告知用户录音功能的存在。 以上就是"Android 手机通话录音demo"的相关知识点,涵盖了权限...

    h5+实现手机端的录音,拍照,录像App

    该demo使用h5+的功能基于android手机实现了录音,拍照,录像并进行上传下载,播放的功能,采用h5开发移动app,理论是支持android和ios的开发,开发工具采用hbuilder,利用hbuilder打包app在android机上运行,目前只...

    demo_录音功能实现

    一、Android录音功能实现 1. 使用MediaRecorder类:Android提供了MediaRecorder类来处理音频录制。首先,你需要实例化MediaRecorder对象,然后配置参数,如输出格式(如AMR_NB)、音频源(如MIC)和输出文件路径。...

    service实现通话录音

    在实现录音功能时,要处理可能出现的各种错误,如文件无法创建、存储空间不足等。在`try-catch`块中捕获异常,并通过日志或通知反馈给用户。 7. **Service的绑定**: 对于需要长时间运行的Service,可以考虑使用...

    Android实现伴奏录音合成MP3

    综上所述,实现“Android实现伴奏录音合成MP3”这一功能,开发者需要深入理解Android音频处理、文件操作、JNI接口以及第三方库的使用,同时掌握良好的项目构建和配置技巧。这是一个涉及到多方面技术的综合项目,对...

    安卓通话录音源码

    3. **音频录制**:使用`MediaRecorder`类来实现录音功能。需要设置音频源(如`AudioSource.VOICE_CALL`),输出格式(如`OutputFormat.THREE_GPP`),以及编码(如`AudioEncoder.AMR_NB`)。启动和停止录音分别调用`...

    Android下录音及播放录音(AudioRecord)

    总之,Android下的录音和播放录音功能通过`AudioRecord`和`MediaPlayer`或`AudioTrack`实现。开发者需要理解音频编码、采样率等概念,并合理配置音频参数,以确保录音和播放的正常进行。在开发过程中,不断测试和...

    android录音并频谱分析绘图

    6. **权限管理**:在Android 6.0及以上版本,录音功能需要申请`RECORD_AUDIO`权限。需要在运行时请求用户授权。 7. **性能优化**:由于频谱分析可能会消耗大量计算资源,所以需要考虑性能优化,例如选择合适的FFT...

    uniapp实现录音、播放功能.rar

    1. **uniapp录音功能**: - **uni.startRecord()**:启动录音,可以设置`duration`参数指定最长录音时间。当达到设定时间或用户松开手指时,录音会自动结束。 - **uni.stopRecord()**:停止录音。如果在`duration`...

Global site tag (gtag.js) - Google Analytics