`

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>

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics