zoukankan      html  css  js  c++  java
  • Android初级教程实现电话录音

    需求:设置来电后自动录音。

    首先设置一个按钮,代码很简单这里就不再给出。

    建一个类,RecorderServicer extends Service

    package com.ydl.recorder;
    
    import java.io.IOException;
    
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaRecorder;
    import android.os.IBinder;
    import android.telecom.TelecomManager;
    import android.telephony.PhoneStateListener;
    import android.telephony.TelephonyManager;
    
    public class RecorderServicer extends Service {
    
    	private MediaRecorder recorder;
    
    	@Override
    	public IBinder onBind(Intent intent) {
    
    		return null;
    	}
    
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    		//监听电话状态
    		tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
    
    	}
    
    	class MyListener extends PhoneStateListener {
    		@Override
    		public void onCallStateChanged(int state, String incomingNumber) {
    			// TODO Auto-generated method stub
    			super.onCallStateChanged(state, incomingNumber);
    
    			switch (state) {
    			case TelephonyManager.CALL_STATE_IDLE:
    				System.out.println("空闲");
    				if (recorder != null) {
    					recorder.stop();// 停止录音
    					recorder.release();
    					recorder = null;
    				}
    
    				break;
    			case TelephonyManager.CALL_STATE_RINGING:
    				System.out.println("响铃");
    				// 进行初始化
    				if (recorder != null) {
    					recorder = new MediaRecorder();
    					recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// Microphone
    																			// audio
    																			// source
    					recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 设置输出3gp格式
    					recorder.setOutputFile("sdcard/luyin.3gp");
    					recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 设置音频编码格式
    					try {
    						recorder.prepare();// 做好准备
    					} catch (Exception e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    
    				break;
    			case TelephonyManager.CALL_STATE_OFFHOOK:
    				System.out.println("摘机");
    
    				// 开始录音
    				if (recorder != null) {
    					recorder.start();
    				}
    			default:
    				break;
    			}
    		}
    	}
    
    }
    

    在主活动界面设置按钮点击事件:用于启动上述服务

    package com.ydl.recorder;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void click(View v){
        	Intent intent = new Intent(this, RecorderServicer.class);
        	startService(intent);
        	
        }
    }
    
    为了做的更逼真一些,设置开机启动服务:因此用到了上一章的开机广播机制

    新建一个类:BootReceiver extends BroadcastReceiver   用于开机启动服务。因为服务是在后台的,不可见面,因此不必设置任务栈即不需要addFlags()方法

    package com.ydl.recorder;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class BootReceiver extends BroadcastReceiver {
    	
    	//设置开机启动服务
    
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		Intent it = new Intent(context, RecorderServicer.class);
    		context.startService(it);
    
    	}
    
    }
    

    上述代码都是对系统进行操作,例如:监听电话状态、设置开机广播、写出数据到SDcard、设置录音方式。因此需要配置权限,同时上边的而广播和服务都要进行相应的配置。

    清单文件的权限和服务广播注册如下:

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

    <service android:name="com.ydl.recorder.RecorderServicer"></service>
            <receiver android:name="com.ydl.recorder.BootReceiver">
                <intent-filter >
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                </intent-filter>
            </receiver>


  • 相关阅读:
    How to Use the UTL_MAIL Package
    ORA-32001: 已请求写入 SPFILE, 但是在启动时未指定 SPFILE
    2.4 批量下达车间任务平台
    2.3 改装及返修任务管理
    2.2 生产外协管理
    2.1 车间排产与生产备料
    1.15 计划分析-订单与预测差异比较
    1.14 计划分析-两周订单变更比较
    1.13 生产计划的调整与维护
    1.12 售后配件需求与计划生产衔接
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299673.html
Copyright © 2011-2022 走看看