欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android编程实现通话录音功能的方法

程序员文章站 2023-11-29 08:37:46
本文实例讲述了android编程实现通话录音功能的方法。分享给大家供大家参考,具体如下: 因受系统限制,只能录自已麦的声音,录不到对方的声音,可能需要改内核才能实现双向录...

本文实例讲述了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>

更多关于android相关内容感兴趣的读者可查看本站专题:《android多媒体操作技巧汇总(音频,视频,录音等)》、《android开发入门与进阶教程》、《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android操作json格式数据技巧总结》、《android文件操作技巧汇总》、《android资源操作技巧汇总》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。