zoukankan      html  css  js  c++  java
  • android 通话录音实现

    因受系统限制,只能录自已麦的声音,录不到对方的声音,可能需要改内核才能实现双向录音;

    接通电话和挂断电话时,震动一下;

    使用广播接收者实现自启动; 

    服务代码:

    package com.eboy.phoneListener;

    import java.io.File;

    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.media.MediaRecorder;
    import android.os.Environment;
    import android.os.IBinder;
    import android.os.Vibrator;
    import android.telephony.PhoneStateListener;
    import android.telephony.TelephonyManager;
    import android.widget.Toast;

    public class phoneService extends Service {

        @Override
        public IBinder onBind(Intent arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void onCreate() {
            // TODO Auto-generated method stub
            super.onCreate();
            TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            telephonyManager.listen(new PhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
        }
        
        private final class PhoneListener extends PhoneStateListener{
            private MediaRecorder mediaRecorder;
            private File file;
            private Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);

            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                try {
                    
                    switch (state){
                    case TelephonyManager.CALL_STATE_RINGING: //来电
                        break;
                        
                    case TelephonyManager.CALL_STATE_OFFHOOK: //接通电话
                        file = new File(Environment.getExternalStorageDirectory(), incomingNumber + System.currentTimeMillis() + ".3gp");
                        mediaRecorder = new MediaRecorder();
                        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                        mediaRecorder.setOutputFile(file.getAbsolutePath());
                        mediaRecorder.prepare();
                        mediaRecorder.start();
                        Toast.makeText(getApplicationContext(), "电话已接通,开始录音。", Toast.LENGTH_SHORT).show();        
                        //震动一下
                        vibrator.vibrate(100);
                        break;
                        
                    case TelephonyManager.CALL_STATE_IDLE: //挂断电话
                        if (mediaRecorder != null){
                            mediaRecorder.stop();
                            mediaRecorder.release();
                            mediaRecorder = null;
                            Toast.makeText(getApplicationContext(), "电话已挂断,录音停止。", Toast.LENGTH_SHORT).show();
                            //震动一下
                            vibrator.vibrate(100);
                        }
                        break;
                    }
                
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }        
        }
    }

    通过广播接收者实现自启动,代码:

    package com.eboy.phoneListener;

    import android.content.Context;
    import android.content.Intent;

    public class BroadcastReceiver extends android.content.BroadcastReceiver {

        @Override
        public void onReceive(Context arg0, Intent arg1) {
            Intent service = new Intent(arg0, phoneService.class);
            arg0.startService(service);
        }
    }

    main.xml:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.eboy.phoneListener"
        android:versionCode="1"
        android:versionName="1.0">

        <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />

        <application android:label="@string/app_name"
            android:icon="@drawable/ic_launcher"
            android:theme="@style/AppTheme">
            
            <service android:name=".phoneService"></service>
            <receiver android:name=".BroadcastReceiver">
                <intent-filter >
                    
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                </intent-filter>
            </receiver>

        </application>
        
        <!-- 读取电话状态权限 -->
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <!-- SD卡读写权限 -->
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <!-- 录音权限 -->
        <uses-permission android:name="android.permission.RECORD_AUDIO"/> 
        <!-- 震动权限 -->
        <uses-permission android:name="android.permission.VIBRATE"/>

    </manifest>

  • 相关阅读:
    qt映射器QSignalMapper的理解
    win10环境下安装Qt4.8、PyQt及development tools
    BZOJ1040 基环森林 找环+基础树形DP
    贪心 BZOJ1034
    HDU5293 树链剖分+树形DP
    BZOJ 1028 BZOJ 1029 //贪心
    BZOJ1025
    仙人掌图判定及求直径HDU3594 BZOJ1023
    BZOJ1021
    BZOJ1022
  • 原文地址:https://www.cnblogs.com/jxgxy/p/2636155.html
Copyright © 2011-2022 走看看