在Android录音电话 [英] Recording phone calls on Android

查看:126
本文介绍了在Android录音电话的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想出来的记录呼出使用麦克风这样写code,但没有工作,我测试了code简单的录音工作正常,我不知道什么时候开始介质记录我的推杆启动在广播接收器可以是问题是存在的。

下面Audiore codeR另一类是建立在那里我已经实现MediaRe codeR

 公共无效的onReceive(上下文的背景下,意图意图){
        // TODO自动生成方法存根

        audrec =新AudioRecorder(新呼叫);
        this.context =背景;
        如果(intent.getAction()。equalsIgnoreCase(Intent.ACTION_DIAL))
        {
            尝试 {
                audrec.start();
                recordstarted = 1;
                telManager =(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

            }赶上(IOException异常E){
                // TODO自动生成的catch块
                e.printStackTrace();
            }
        }

        最后PhoneStateListener phoneListener =新PhoneStateListener()
        {
            @覆盖
            公共无效onCallStateChanged(最终诠释状态,最后弦乐incomingNumber)
            {
                getTelephonyOverview(telManager);
            }
        };

        telManager.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);

    }
    公共无效getTelephonyOverview(最终TelephonyManager telManager)
    {
        INT callState = telManager.getCallState();
        开关(callState)
        {
        案例TelephonyManager.CALL_STATE_IDLE:
        {
            如果(recordstarted == 1)
            {
                尝试 {
                    audrec.stop();
                }赶上(IOException异常E){
                    // TODO自动生成的catch块
                    e.printStackTrace();
                }
                recordstarted = 0;
            }
            打破;
        }
        案例TelephonyManager.CALL_STATE_OFFHOOK:
        {
            尝试 {
                audrec.start();
            }赶上(IOException异常E){
                // TODO自动生成的catch块
                e.printStackTrace();
            }
            recordstarted = 1;
            打破;
        }
        案例TelephonyManager.CALL_STATE_RINGING:
        {
            尝试 {
                audrec.start();
            }赶上(IOException异常E){
                // TODO自动生成的catch块
                e.printStackTrace();
            }
            recordstarted = 1;
            打破;
        }
        }
    }
 

另外code,我想指出,创建3GP文件,但不玩

 进口android.app.Activity;
进口android.os.Bundle;
进口android.view.View;
进口android.widget.Button;

公共类androidrec扩展活动
{
   按钮btn_start;
   / **第一次创建活动时调用。 * /
   @覆盖
   公共无效的onCreate(包savedInstanceState)
   {
      super.onCreate(savedInstanceState);的setContentView(R.layout.main);
      btn_start =(按钮)findViewById(R.id.btn_start);
      UpdateRecorderState();
      btn_start.setOnClickListener(新View.OnClickListener()
      {
         公共无效的onClick(视图v)
         {
            // Toast.makeText(getBaseContext(),请同时输入电话号码和信息。
            // Toast.LENGTH_SHORT).show();
            如果(SharedData._Started!){StartServicesAtStartUp.Start_CallRec(getBaseContext()); }
            其他{StartServicesAtStartUp.Stop_CallRec(getBaseContext()); }
            UpdateRecorderState();
         }
      });


   }

   私人无效UpdateRecorderState()
   {
      如果(SharedData._Started)
      {btn_start.setText(停止录制);}
      其他
      {btn_start.setText(开始录制);}
   }
} [/ code]


进口的java.io.File;
进口java.io.IOException异常;
进口java.text.SimpleDateFormat的;
进口java.util.Date;

进口android.media.MediaRecorder;
进口android.telephony.PhoneStateListener;
进口android.telephony.TelephonyManager;
进口android.util.Log;

//进口com.lumitrend.netlogger.Logger;

公共类CallStateListener扩展PhoneStateListener {
   公共无效onCallStateChanged(INT状态,串incomingNumber)
   {
      super.onCallStateChanged(州,incomingNumber);
      开关(州)
      {
      案例TelephonyManager.CALL_STATE_IDLE:
         如果(SharedData._Recording)
         {Recorders_Stop(); }
         打破;
      案例TelephonyManager.CALL_STATE_RINGING:
         打破;
      案例TelephonyManager.CALL_STATE_OFFHOOK:
         串CallDate = SanityDate();
         字符串CallNum = SanityNum(incomingNumber);
         字符串ROOTDIR = SharedData._Path;
         串CallDir = SharedData._Path + CallNum +/;
         字符串CallFile = SharedData._Path + CallNum +/+ CallNum + CallDate;
         如果(!SharedData._Recording)
         {
            SharedData._Recording = TRUE;
            串med_state = android.os.Environment.getExternalStorageState();
            如果(!med_state.equals(android.os.Environment.MEDIA_MOUNTED))
            { 打破; }

            文件目录= NULL;
            目录=新的文件(ROOTDIR +的text.txt).getParentFile();
            如果(directory.exists()及!&安培;!directory.mkdirs())
            { 打破; }

            目录=新的文件(CallDir +的text.txt).getParentFile();
            如果(directory.exists()及!&安培;!directory.mkdirs())
            { 打破; }

            再coders_Init(CallFile);
            Recorder_ prepare();
         }
         Log.v(调试,TelephonyManager.CALL_STATE_OFFHOOK +ITS.CallRecorder  - 录制开始+状态);
         打破;
      }
   }

   私人字符串SanityDate(){
      SimpleDateFormat的格式化=新的SimpleDateFormat(YYMMDD,HHMMSS);
      日期currentTime_1 =新的日期();
      返回formatter.format(currentTime_1);
   }

   私人无效Recorders_Stop(){
      尝试 {
         SharedData._recorder.stop(); SharedData._recorder.reset();
         //SharedData._recorder_down.stop(); SharedData._recorder_down.reset();
         //SharedData._recorder_up.stop(); SharedData._recorder_up.reset();
      }
      赶上(IllegalStateException异常E){}
      SharedData._Recording = FALSE;
   }

   私人无效Recorder_ prepare(){
      尝试 {
         SharedData._recorder prepare()。 SharedData._recorder.start();
         //SharedData._recorder_down.$p$ppare(); SharedData._recorder_down.start();
         //SharedData._recorder_up.$p$ppare(); SharedData._recorder_up.start();
      }
      赶上(IllegalStateException异常E){e.printStackTrace(); }
      赶上(IOException异常E){e.printStackTrace(); }
   }

   私人无效再coders_Init(字符串路径){
      字符串_ext =名为.3gp;
      INT out_format = MediaRecorder.OutputFormat.THREE_GPP;

      SharedData._recorder.setAudioSource(SharedData._Rec_Type);
      SharedData._recorder.setOutputFormat(out_format);
      SharedData._recorder.setAudioEn codeR(MediaRecorder.AudioEn coder.AMR_NB);
      SharedData._recorder.setOutputFile(路径+两个+ _ext);

      / *
                SharedData._recorder_down.setAudioSource(MediaRecorder.AudioSource.VOICE_DOWNLINK);
                SharedData._recorder_down.setOutputFormat(out_format);
                SharedData._recorder_down.setAudioEn codeR(MediaRecorder.AudioEn coder.AMR_NB);
                SharedData._recorder_down.setOutputFile(路径+升降压+ _ext);

                SharedData._recorder_up.setAudioSource(MediaRecorder.AudioSource.VOICE_UPLINK);
                SharedData._recorder_up.setOutputFormat(out_format);
                SharedData._recorder_up.setAudioEn codeR(MediaRecorder.AudioEn coder.AMR_NB);
                SharedData._recorder_up.setOutputFile(路径+UP+ _ext);
       * /

   }
   私人字符串SanityNum(字符串numstr)
   {
      串出=;
      对于(CHAR CH:numstr.toCharArray())
      {
         开关(CH)
         {
         外壳 ' ':
            打破;
         案〜:
            打破;
         外壳 '!':
            打破;
         外壳 '@':
            打破;
         外壳 '#':
            打破;
         案$:
            打破;
         外壳 '%':
            打破;
         案例'^':
            打破;
         案件'和;':
            打破;
         外壳 '*':
            打破;
         外壳 '(':
            打破;
         外壳 ')':
            打破;
         外壳 '-':
            打破;
         外壳 '_':
            打破;
         情况下=:
            打破;
         案|:
            打破;
         默认:
            OUT = OUT + CH;
         }
      }
      返回了;
   }
}


进口android.media.MediaRecorder;

最终的公共类SharedData
{

   静态INT _Rec_Type = android.media.MediaRecorder.AudioSource.VOICE_CALL;


   静态字符串_path = android.os.Environment.getExternalStorageDirectory()getAbsolutePath()+/ ITS-CallRecorder /。
   静态布尔_Started = FALSE;
   静态布尔_AutoStart = TRUE;
   静态布尔_Recording = FALSE;

   静态MediaRecorder _recorder =新MediaRecorder();
   静态MediaRecorder _recorder_down =新MediaRecorder();
   静态MediaRecorder _recorder_up =新MediaRecorder();

   SharedData(){}
}

进口android.content.BroadcastReceiver;
进口android.content.Context;
进口android.content.Intent;
进口android.telephony.PhoneStateListener;
进口android.telephony.TelephonyManager;
进口android.util.Log;
进口android.widget.Toast;



公共类StartServicesAtStartUp扩展的BroadcastReceiver
{
   公共静态意图phoneStateListener;
   公共无效的onReceive(上下文的背景下,意图意图)
   {
      Log.d(调试,com.its.CallRecorder启动......);
      Start_CallRec(上下文);
   }

   公共静态无效Start_CallRec(上下文的背景下)
   {
      如果(!SharedData._Started)
      {
         如果(SharedData._AutoStart)
         {
            phoneStateListener =新的意图(背景下,CallStateListener.class);
            phoneStateListener.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startService(phoneStateListener);
            Log.d(调试,com.its.CallRecorder通话记录开始......);
            TelephonyManager tManager =(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
            CallStateListener callStateListener =新CallStateListener();
            tManager.listen(callStateListener,PhoneStateListener.LISTEN_CALL_STATE);
            SharedData._Started = TRUE;
            Toast.makeText(背景下,通话录音开始......,Toast.LENGTH_SHORT).show();
         }
      }
      其他
      {
         Toast.makeText(背景下,电话录音已经处于活动状态。,Toast.LENGTH_SHORT).show();
      }
   }

   公共静态无效Stop_CallRec(上下文的背景下)
   {
      如果(SharedData._Started)
      {
         context.stopService(phoneStateListener);
         Toast.makeText(背景下,通话录音停止......,Toast.LENGTH_SHORT).show();
         SharedData._Started = FALSE;
      }
      其他
      {
         Toast.makeText(背景下,通话录音已停止......,Toast.LENGTH_SHORT).show();
      }
   }

}
 

解决方案

通话记录尚无法在Android上。看到这个功能要求

您可以记录从话筒你的声音,但你不能录制对方的声音。如果你只是想记录你的声音使用android.media.MediaRecorder.AudioSource.MIC

I am trying out the record outgoing call using mic written this code but not working, I tested the code for simple audio record it works fine, I am not sure when to start media record I putted start in broadcast receiver may be problem is there.

Here Audiorecoder is another class is created where I have implemented MediaRecoder

public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        audrec = new AudioRecorder("newcall");
        this.context = context;
        if (intent.getAction().equalsIgnoreCase(Intent.ACTION_DIAL)) 
        {
            try {
                audrec.start();
                recordstarted = 1;
                telManager= (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        final PhoneStateListener phoneListener = new PhoneStateListener()
        {
            @Override
            public void onCallStateChanged(final int state, final String incomingNumber)
            {
                getTelephonyOverview(telManager);
            }
        };

        telManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);

    }
    public void getTelephonyOverview(final TelephonyManager telManager)
    {
        int callState = telManager.getCallState();
        switch (callState)
        {
        case TelephonyManager.CALL_STATE_IDLE:
        {
            if (recordstarted==1)
            {
                try {
                    audrec.stop();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                recordstarted =0;
            }
            break;
        }
        case TelephonyManager.CALL_STATE_OFFHOOK:
        {
            try {
                audrec.start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            recordstarted =1;
            break;
        }
        case TelephonyManager.CALL_STATE_RINGING:       
        {
            try {
                audrec.start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            recordstarted =1;
            break;
        }
        }
    }   

Another Code that i am trying out that create 3Gp file but not playing

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class androidrec extends Activity
{
   Button btn_start;
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
      super.onCreate(savedInstanceState); setContentView(R.layout.main);
      btn_start = (Button) findViewById(R.id.btn_start);
      UpdateRecorderState();
      btn_start.setOnClickListener(new View.OnClickListener() 
      {
         public void onClick(View v) 
         {              
            //          Toast.makeText(getBaseContext(),"Please enter both phone number and message.", 
            //          Toast.LENGTH_SHORT).show();
            if(!SharedData._Started) { StartServicesAtStartUp.Start_CallRec(getBaseContext()); }
            else { StartServicesAtStartUp.Stop_CallRec(getBaseContext()); }
            UpdateRecorderState();
         }
      });        


   }

   private void UpdateRecorderState() 
   {
      if(SharedData._Started)
      {btn_start.setText("Stop Recording");}
      else
      {btn_start.setText("Start Recording");}
   }
}[/code]


import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.media.MediaRecorder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

//import com.lumitrend.netlogger.Logger;

public class CallStateListener extends PhoneStateListener {
   public void onCallStateChanged(int state, String incomingNumber)
   {
      super.onCallStateChanged(state, incomingNumber);
      switch(state)
      {
      case TelephonyManager.CALL_STATE_IDLE:
         if(SharedData._Recording) 
         { Recorders_Stop(); }
         break;
      case TelephonyManager.CALL_STATE_RINGING:
         break;
      case TelephonyManager.CALL_STATE_OFFHOOK:
         String CallDate = SanityDate();
         String CallNum = SanityNum(incomingNumber);
         String RootDir = SharedData._Path ;  
         String CallDir = SharedData._Path + CallNum + "/" ;
         String CallFile = SharedData._Path +  CallNum + "/" + CallNum + CallDate ;
         if(!SharedData._Recording)
         {
            SharedData._Recording = true;
            String med_state = android.os.Environment.getExternalStorageState();
            if(!med_state.equals(android.os.Environment.MEDIA_MOUNTED))
            { break; }

            File directory = null;
            directory = new File(RootDir + "text.txt" ).getParentFile();
            if (!directory.exists() && !directory.mkdirs())
            { break; }

            directory = new File(CallDir + "text.txt" ).getParentFile();
            if (!directory.exists() && !directory.mkdirs())
            { break; }

            Recoders_Init(CallFile);
            Recorder_Prepare();
         }
         Log.v("DEBUG", TelephonyManager.CALL_STATE_OFFHOOK + " ITS.CallRecorder - Recording Started " + state);
         break;
      }
   }

   private String SanityDate() {
      SimpleDateFormat formatter = new SimpleDateFormat("yyMMdd-HHmmss");
      Date currentTime_1 = new Date();
      return formatter.format(currentTime_1);
   }

   private void Recorders_Stop() {
      try { 
         SharedData._recorder.stop(); SharedData._recorder.reset();
         //SharedData._recorder_down.stop(); SharedData._recorder_down.reset();
         //SharedData._recorder_up.stop();       SharedData._recorder_up.reset(); 
      }
      catch (IllegalStateException e) {}
      SharedData._Recording = false;
   }

   private void Recorder_Prepare() {
      try {
         SharedData._recorder.prepare(); SharedData._recorder.start(); 
         //SharedData._recorder_down.prepare(); SharedData._recorder_down.start(); 
         //SharedData._recorder_up.prepare(); SharedData._recorder_up.start(); 
      }
      catch (IllegalStateException e) { e.printStackTrace(); }
      catch (IOException e) { e.printStackTrace(); }
   }

   private void Recoders_Init(String path) {
      String _ext = ".3gp";
      int out_format = MediaRecorder.OutputFormat.THREE_GPP;

      SharedData._recorder.setAudioSource(SharedData._Rec_Type);
      SharedData._recorder.setOutputFormat(out_format);
      SharedData._recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
      SharedData._recorder.setOutputFile(path + "both" + _ext);

      /*
                SharedData._recorder_down.setAudioSource(MediaRecorder.AudioSource.VOICE_DOWNLINK);
                SharedData._recorder_down.setOutputFormat(out_format);
                SharedData._recorder_down.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                SharedData._recorder_down.setOutputFile(path + "-down" + _ext);

                SharedData._recorder_up.setAudioSource(MediaRecorder.AudioSource.VOICE_UPLINK);
                SharedData._recorder_up.setOutputFormat(out_format);
                SharedData._recorder_up.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                SharedData._recorder_up.setOutputFile(path  + "-up" + _ext);
       */

   }
   private String SanityNum(String numstr)
   {
      String out = "";
      for(char ch : numstr.toCharArray())
      {
         switch(ch)
         {
         case ' ': 
            break;
         case '~': 
            break;
         case '!': 
            break;
         case '@': 
            break;
         case '#': 
            break;
         case '$': 
            break;
         case '%': 
            break;
         case '^': 
            break;
         case '&': 
            break;
         case '*': 
            break;
         case '(': 
            break;
         case ')': 
            break;
         case '-': 
            break;
         case '_': 
            break;
         case '=': 
            break;
         case '|': 
            break;
         default:
            out = out + ch;
         }
      }
      return out;
   }
} 


import android.media.MediaRecorder;

final public class SharedData
{

   static int _Rec_Type = android.media.MediaRecorder.AudioSource.VOICE_CALL;


   static String _Path = android.os.Environment.getExternalStorageDirectory().getAbsolutePath() + "/ITS-CallRecorder/";
   static boolean _Started = false;
   static boolean _AutoStart = true;
   static boolean _Recording = false;

   static MediaRecorder _recorder = new MediaRecorder();
   static MediaRecorder _recorder_down = new MediaRecorder();
   static MediaRecorder _recorder_up = new MediaRecorder();

   SharedData() {    }
}

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;



public class StartServicesAtStartUp extends BroadcastReceiver
{
   public static Intent phoneStateListener;
   public void onReceive(Context context, Intent intent)
   {
      Log.d("DEBUG", "com.its.CallRecorder Initiated ...");
      Start_CallRec(context);
   }

   public static void Start_CallRec(Context context)
   {
      if(!SharedData._Started )
      {
         if(SharedData._AutoStart)
         {
            phoneStateListener = new Intent(context, CallStateListener.class);
            phoneStateListener.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startService(phoneStateListener);
            Log.d("DEBUG", "com.its.CallRecorder Call Recorder Started ...");
            TelephonyManager tManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            CallStateListener callStateListener = new CallStateListener();
            tManager.listen(callStateListener,PhoneStateListener.LISTEN_CALL_STATE);
            SharedData._Started = true;
            Toast.makeText(context," Call Recording Started ... ", Toast.LENGTH_SHORT).show();
         }       
      }
      else
      {
         Toast.makeText(context," Call Recording Already Active.. ", Toast.LENGTH_SHORT).show();
      }
   }

   public static void Stop_CallRec(Context context)
   {
      if(SharedData._Started )
      {
         context.stopService(phoneStateListener);
         Toast.makeText(context," Call Recording Stopped  ... ", Toast.LENGTH_SHORT).show();
         SharedData._Started = false;                    
      }
      else
      {
         Toast.makeText(context," Call Recording Already Stopped  ... ",  Toast.LENGTH_SHORT).show();
      }
   }

}

解决方案

Call recording is not yet possible on Android. See this feature request.

You can record your voice from microphone, but you can not record the sound of the other party. If you only want to record your voice use android.media.MediaRecorder.AudioSource.MIC

这篇关于在Android录音电话的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆