안 드 로 이 드 는 전화 오 가 는 자동 녹음 기능 을 실현 한다.

30769 단어 Android전화 녹음
우 리 는 안 드 로 이 드 핸드폰 으로 전 화 를 할 때 가끔 전화 통 화 를 자동 으로 녹음 해 야 할 수도 있 습 니 다.본 고 는 안 드 로 이 드 전화 통 화 를 자동 으로 녹음 하 는 방법 을 상세 하 게 설명 합 니 다.여러분 은 글 의 방법 에 따라 프로그램 을 작성 하면 이 기능 을 완성 할 수 있 습 니 다.
       전화 가 오 가 는 자동 녹음 의 관건 은 핸드폰 전화 상태의 변 화 를 어떻게 감청 하 느 냐 에 있다.
       1)전화 가 온 상태의 전환 은 다음 과 같다.(빨간색 표 시 는 우리 가 사용 해 야 할 상태 이다)
       한가(IDEL)―벨(RINGING)―받 기(ACTIVE)―끊 기(DISCONNECTING-DISCONNECTED 경험)―>한가(IDEL)
       혹은  한가(IDEL)―벨(RINGING)―거부―>한가(IDEL)
       2)탈 전 상태의 전환 은 다음 과 같다.
       한가(IDEL)―전화 걸 기(DIALING)―(상대방)벨 울 리 기(ALERTING)―연결(ACTIVE)구축―끊 기(DISCONNECTING-DISCONNECTED 경험)―여가(IDEL)
       혹은 한가(IDEL)―전화 걸 기(DIALING)―(상대방)벨 울 리 기(ALERTING)―>끊 기/상대방 거부―>한가(IDEL)
       다음은 전화 와 탈 전 이라는 두 가지 상태 에 대해 분석 하고 실현 한다.
       1.먼저 전보 의 분석 과 실현 을 진행한다.
       전기 가 들 어 오 는 것 에 비해 전기 가 들 어 오 는 상태의 전환 검 사 는 간단 해 야 한다.안 드 로 이 드 api 의 Phone State Listener 류 는 해당 하 는 방법 을 제공 합 니 다.그러나 우 리 는 그 중의 onCallState Changed(int state,String incomingNumber)방법 을 덮어 쓰 면 전화 상 태 를 검사 할 수 있 고 이 를 바탕 으로 녹음 기능 을 추가 하면 됩 니 다.그 중에서 state 인 자 는 바로 각종 전화 상태 입 니 다.그때 우 리 는 그것 을 아래 에 우리 가 사용 하고 자 하 는 상태 와 비교 합 니 다.만약 에 전화 가 우리 가 원 하 는 상태 에 있 으 면 일련의 조작 을 합 니 다.그렇지 않 으 면 그 를 상관 하지 않 습 니 다.이러한 상 태 를 얻 으 려 면 또 다른 전화 관련 유형 이 필요 합 니 다.바로 Telephony Manager 입 니 다.이 종 류 는 일부 전화 상 태 를 제공 합 니 다.그 중에서 우리 가 사용 해 야 할 것 은 Telephony Manager.CALL 입 니 다.STATE_IDLE(한가),TelephonyManager.CALLSTATE_OFPHOOK(발췌 기)와 Telephony Manager.CALLSTATE_링 잉 세 가지 상태.이 세 가지 상 태 를 판별 하면 android.telephony.PhoneStateListener 류 를 계승 하여 위 에서 언급 한 onCallStateChanged(int state,String incomingNumber)방법 을 실현 할 수 있 습 니 다.다음 코드 를 보십시오.

public class TelListener extends PhoneStateListener {  
  
 @Override  
 public void onCallStateChanged(int state, String incomingNumber) {  
  super.onCallStateChanged(state, incomingNumber);  
  
  switch (state) {  
  case TelephonyManager.CALL_STATE_IDLE: //     ,          
   Log.i("TelephoneState", "IDLE");  
   //            
   break;  
  case TelephonyManager.CALL_STATE_RINGING: //       
   Log.i("TelephoneState", "RINGING");  
   //            
   break;  
  case TelephonyManager.CALL_STATE_OFFHOOK: //   ,    
   Log.i("TelephoneState", "OFFHOOK");  
   //            
   break;  
  }  
  
  Log.i("TelephoneState", String.valueOf(incomingNumber));  
 }  
  
} 
상기 전화 상태 감청 코드 가 있 으 면 감청 기능 을 실현 하기 에는 부족 하고 우리 의 Activity 나 Service 에서 감청 을 실현 해 야 합 니 다.방법 은 간단 합 니 다.코드 는 다음 과 같 습 니 다.

/** 
*  activity    service       ,          
*/ 
TelephonyManager telMgr = (TelephonyManager)context.getSystemService( 
    Context.TELEPHONY_SERVICE); 
  telMgr.listen(new TelListener(), PhoneStateListener.LISTEN_CALL_STATE); 
이렇게 하면 전화 상태 감청 기능 을 실현 할 수 있 지만 장치 에서 달 릴 수 있 으 려 면 아직 부족 합 니 다.핸드폰 전화 상 태 를 얻 을 수 있 는 두 가지 권한 이 필요 합 니 다.

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 
이렇게 하면 뛸 수 있어.
       말 나 온 김 에 녹음 기능 을 실현 할 수 있다 면 이 를 바탕 으로 전화 자동 녹음 을 실현 하 는 것 은 문제 가 없 을 것 이 라 고 생각 합 니 다.하지만 간단하게 몇 마디 하 겠 습 니 다.전화 가 왔 으 니 녹음 을 하려 면 Telephony Manager.CALL 을 감청 하고 있 는 것 같 습 니 다.STATE_OFPHOOK 상태 에서 녹음 기 를 켜 고 녹음 을 시작 하여 Telephony Manager.CALL 을 감청 합 니 다.STATE_IDLE 상태 일 때 녹음 기 를 끄 고 녹음 을 중단 합 니 다.이렇게 하면 전화 녹음 기능 이 완성 되 고 녹음 기능 도 똑 같이 권한 이 필요 하 다 는 것 을 잊 지 마 세 요.

<uses-permission android:name="android.permission.RECORD_AUDIO"/>  
  
<!--                         -->  
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
2.전화 가 오 면 자동 으로 녹음 하 는 방법 을 소개 하고 전기 가 오 면 자동 으로 녹음 하 는 실현 방법 을 소개 합 니 다.
       위 에서 말 했 듯 이 전화 상태의 감청 에 비해 전 기 를 보 내 는 것 이 번 거 롭 고 심지어 이런 방법 은 통용 되 지 않 는 다.이것 은 주로 안 드 로 이 드 api 에서 전기 상태 감청 의 해당 유형 과 방법 을 제공 하지 않 았 기 때문이다(아마 내 가 방금 접 촉 했 기 때문에 찾 지 못 했 을 것 이다).처음에 인터넷 에서 한 통 검색 해 봤 지만 대응 하 는 해결 방법 을 찾 지 못 했다.대부분 전화 로 감청 한 것 이 바로 위의 방법 이다.그러나 중간 에 블 로그 한 편 을 발 견 했 습 니 다.시스템 로 그 를 조회 하 는 방식 으로 전 기 를 찾 는 과정 에서 각 상태의 키 워드 를 찾 았 습 니 다.어 쩔 수 없 이 결국 이 방법 을 타협 했다.
       나의(A65 상의)탈 전 로그 내용 은 다음 과 같다.
       필터 키 워드 는 mforeground 입 니 다.

01-06 16:29:54.225: D/InCallScreen(251): onPhoneStateChanged: mForegroundCall.getState() : DIALING 
01-06 16:29:54.245: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mForegroundCall.getState() : DIALING 
01-06 16:29:54.631: D/InCallScreen(251): onPhoneStateChanged: mForegroundCall.getState() : DIALING 
01-06 16:29:54.645: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mForegroundCall.getState() : DIALING 
01-06 16:29:54.742: D/InCallScreen(251): onPhoneStateChanged: mForegroundCall.getState() : DIALING 
01-06 16:29:54.766: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mForegroundCall.getState() : DIALING 
01-06 16:29:54.873: D/InCallScreen(251): onPhoneStateChanged: mForegroundCall.getState() : DIALING 
01-06 16:29:54.877: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mForegroundCall.getState() : DIALING 
01-06 16:29:55.108: D/InCallScreen(251): onPhoneStateChanged: mForegroundCall.getState() : DIALING 
01-06 16:29:55.125: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mForegroundCall.getState() : DIALING 
01-06 16:29:57.030: D/InCallScreen(251): onPhoneStateChanged: mForegroundCall.getState() : ACTIVE 
01-06 16:29:57.155: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mForegroundCall.getState() : ACTIVE 
01-06 16:29:57.480: D/InCallScreen(251): onPhoneStateChanged: mForegroundCall.getState() : ACTIVE 
01-06 16:29:57.598: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mForegroundCall.getState() : ACTIVE 
01-06 16:29:59.319: D/InCallScreen(251): onPhoneStateChanged: mForegroundCall.getState() : DISCONNECTING 
01-06 16:29:59.373: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mForegroundCall.getState() : DISCONNECTING 
01-06 16:30:00.392: D/InCallScreen(251): - onDisconnect: currentlyIdle:true ; mForegroundCall.getState():DISCONNECTED 
01-06 16:30:00.399: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): - onDisconnect: currentlyIdle:true ; mForegroundCall.getState():DISCONNECTED 
01-06 16:30:01.042: D/InCallScreen(251): onPhoneStateChanged: mForegroundCall.getState() : IDLE 
01-06 16:30:01.070: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mForegroundCall.getState() : IDLE 
01-06 16:30:01.558: D/InCallScreen(251): onPhoneStateChanged: mForegroundCall.getState() : IDLE 
01-06 16:30:01.572: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mForegroundCall.getState() : IDLE 
            필터 키워드  mbackground

01-06 16:29:54.226: D/InCallScreen(251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:54.256: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:54.638: D/InCallScreen(251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:54.652: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:54.743: D/InCallScreen(251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:54.770: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:54.875: D/InCallScreen(251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:54.882: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:55.109: D/InCallScreen(251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:55.142: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:57.031: D/InCallScreen(251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:57.160: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:57.481: D/InCallScreen(251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:57.622: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:59.319: D/InCallScreen(251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:29:59.373: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:30:01.042: D/InCallScreen(251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:30:01.070: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:30:01.559: D/InCallScreen(251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
01-06 16:30:01.573: V/LogInfo OutGoing Call(2492): D/InCallScreen( 251): onPhoneStateChanged: mBackgroundCall.getState() : IDLE 
위의 로그 에서 볼 수 있 듯 이 모든 줄 의 끝 에 있 는 대문자 영문 단 어 는 바로 전 기 를 제거 한 상태 이 고 상 태 는 다음 과 같다.
  •        DIALING 다이얼,상대방 이 아직 벨 을 울 리 지 않 았 습 니 다
  •        ACTIVE   상대방 연결,통화 수립
  •        DISCONNECTING 통화 가 끊 겼 을 때
  •        DISCONNECTED  통화 가 끊 겼 으 니 자동 사냥 이 라 고 볼 수 있 습 니 다
  •        내 가 전 화 를 걸 었 던 것 은 10010 이 었 기 때문에 벨 을 울 리 는 과정(컴퓨터 가 자동 으로 연결 되 는 것 이 매우 빠르다)이 없 었 고 상태 가 하나 줄 었 다.상 태 는 ALERTING 이 었 다.이것 이 바로 상대방 이 벨 을 울 리 고 있 는 상태 이다.
           이 몇 개의 탈 전 상태 가 있 으 면 쉽게 할 수 있 습 니 다.지금 우리 가 해 야 할 일 은 시스템 로 그 를 읽 고 이 상 태 를 찾 는 것 입 니 다.추출 키 워드 는 바로 위 에서 언급 한 mforeground(프론트 통화 상태)와 mbackground(백 스테이지 통화 상태)입 니 다.읽 은 이 줄 로그 에 mforground 가 포함 되 어 있다 면 위의 상 태 를 포함 하 는 단어 가 있 는 지 확인 하 십시오.그렇다면 시스템 로 그 를 읽 는 코드 를 보 세 요.
    
    package com.sdvdxl.phonerecorder; 
     
    import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.InputStreamReader; 
     
    import com.sdvdxl.outgoingcall.OutgoingCallState; 
     
    import android.content.Context; 
    import android.content.Intent; 
    import android.util.Log; 
     
    /** 
     * 
     * @author sdvdxl 
     *         
     * onPhoneStateChanged: mForegroundCall.getState()           
     * mBackgroundCall.getState()      
     *     DIALING       ,      ,        , 
     * ALERTING     ,       , 
     *    ACTIVE       
     *    DISCONNECTED            
     *    IDLE           
     *  
     */ 
    public class ReadLog extends Thread { 
     private Context ctx; 
     private int logCount; 
      
     private static final String TAG = "LogInfo OutGoing Call"; 
      
     /** 
      *       
      * @author sdvdxl 
      *  
      */ 
     private static class CallViewState { 
      public static final String FORE_GROUND_CALL_STATE = "mForeground"; 
     } 
      
     /** 
      *      
      * @author sdvdxl 
      * 
      */ 
     private static class CallState { 
      public static final String DIALING = "DIALING"; 
      public static final String ALERTING = "ALERTING"; 
      public static final String ACTIVE = "ACTIVE"; 
      public static final String IDLE = "IDLE"; 
      public static final String DISCONNECTED = "DISCONNECTED"; 
     } 
      
     public ReadLog(Context ctx) { 
      this.ctx = ctx; 
     } 
      
     /** 
      *   Log  
      *        log 
      *          
      */ 
     @Override 
     public void run() { 
      Log.d(TAG, "        "); 
       
      String[] catchParams = {"logcat", "InCallScreen *:s"}; 
      String[] clearParams = {"logcat", "-c"}; 
       
      try { 
       Process process=Runtime.getRuntime().exec(catchParams); 
       InputStream is = process.getInputStream(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
        
       String line = null; 
       while ((line=reader.readLine())!=null) { 
        logCount++; 
        //     
       Log.v(TAG, line); 
         
        //    512     
        if (logCount>512) { 
         //     
         Runtime.getRuntime().exec(clearParams) 
          .destroy();//    ,     
         logCount = 0; 
         Log.v(TAG, "-----------    ---------------"); 
        }  
         
        /*---------------------------------    -----------------------*/ 
        //   
        if (line.contains(ReadLog.CallViewState.FORE_GROUND_CALL_STATE) 
          && line.contains(ReadLog.CallState.IDLE)) { 
         Log.d(TAG, ReadLog.CallState.IDLE); 
        } 
         
        //    ,      ,    ,        , 
        if (line.contains(ReadLog.CallViewState.FORE_GROUND_CALL_STATE) 
          && line.contains(ReadLog.CallState.DIALING)) { 
         Log.d(TAG, ReadLog.CallState.DIALING); 
        } 
         
        //          
        if (line.contains(ReadLog.CallViewState.FORE_GROUND_CALL_STATE) 
          && line.contains(ReadLog.CallState.ALERTING)) { 
         Log.d(TAG, ReadLog.CallState.ALERTING); 
        } 
         
        //   ,     
        if (line.contains(ReadLog.CallViewState.FORE_GROUND_CALL_STATE) 
          && line.contains(ReadLog.CallState.ACTIVE)) { 
         Log.d(TAG, ReadLog.CallState.ACTIVE); 
        } 
         
        //    ,    
        if (line.contains(ReadLog.CallViewState.FORE_GROUND_CALL_STATE) 
          && line.contains(ReadLog.CallState.DISCONNECTED)) { 
         Log.d(TAG, ReadLog.CallState.DISCONNECTED); 
        } 
         
       } //END while 
        
      } catch (IOException e) { 
       e.printStackTrace(); 
      } //END try-catch 
     } //END run 
    } //END class ReadLog 
    상기 코드 에서 스 레 드 를 사용 하 는 이 유 는 로 그 를 읽 는 과정 에서 주 방법의 다른 방법 이 실행 되 는 것 을 방지 하고 프로그램 이 해당 하 는 전화 상 태 를 포착 하 는 데 영향 을 주기 위해 서 입 니 다.
           자,탈 전 과정 에서 각 상태의 변 화 를 포착 하 였 습 니 다.그러면 프로그램 에 어떻게 알려 야 합 니까?제 가 사용 하 는 방법 은 캡 처 한 후에 바로 시스템 에 방송 을 보 낸 다음 에 프로그램 이 방송 수신 을 하고 받 은 후에 녹음 사건 을 처리 하 는 것 입 니 다.방송 을 보 내 려 면 유일한 방송 을 보 내야 합 니 다.이 를 위해 다음 과 같은 종 류 를 만 듭 니 다.
    
    package com.sdvdxl.outgoingcall; 
     
    import com.sdvdxl.phonerecorder.ReadLog; 
     
    import android.content.Context; 
    import android.util.Log; 
     
    public class OutgoingCallState { 
     Context ctx; 
     public OutgoingCallState(Context ctx) { 
      this.ctx = ctx; 
     } 
      
     /** 
      *        
      * @author sdvdxl 
      * 
      */ 
     public static final class ForeGroundCallState { 
      public static final String DIALING =  
        "com.sdvdxl.phonerecorder.FORE_GROUND_DIALING"; 
      public static final String ALERTING =  
        "com.sdvdxl.phonerecorder.FORE_GROUND_ALERTING"; 
      public static final String ACTIVE =  
        "com.sdvdxl.phonerecorder.FORE_GROUND_ACTIVE"; 
      public static final String IDLE =  
        "com.sdvdxl.phonerecorder.FORE_GROUND_IDLE"; 
      public static final String DISCONNECTED =  
        "com.sdvdxl.phonerecorder.FORE_GROUND_DISCONNECTED"; 
     } 
      
     /** 
      *            , 
      *            
      */ 
     public void startListen() { 
      new ReadLog(ctx).start(); 
      Log.d("Recorder", "           ,          "); 
     } 
      
    } 
     프로그램 이 시스템 로그 권한 을 읽 어야 합 니 다:
    XML/HTML 코드
              
           그리고 로 그 를 읽 는 클래스 에서 전 기 를 제거 한 상태 에서 라디오 를 보 내 는 것 을 감지 하면 로 그 를 읽 는 전체 코드 는 다음 과 같 습 니 다.
    
    package com.sdvdxl.phonerecorder; 
     
    import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.InputStreamReader; 
     
    import com.sdvdxl.outgoingcall.OutgoingCallState; 
     
    import android.content.Context; 
    import android.content.Intent; 
    import android.util.Log; 
     
    /** 
     * 
     * @author mrloong 
     *         
     * onPhoneStateChanged: mForegroundCall.getState()           
     * mBackgroundCall.getState()      
     *     DIALING       ,      ,        , 
     * ALERTING     ,       , 
     *    ACTIVE       
     *    DISCONNECTED            
     *    IDLE           
     *  
     */ 
    public class ReadLog extends Thread { 
     private Context ctx; 
     private int logCount; 
      
     private static final String TAG = "LogInfo OutGoing Call"; 
      
     /** 
      *       
      * @author sdvdxl 
      *  
      */ 
     private static class CallViewState { 
      public static final String FORE_GROUND_CALL_STATE = "mForeground"; 
     } 
      
     /** 
      *      
      * @author sdvdxl 
      * 
      */ 
     private static class CallState { 
      public static final String DIALING = "DIALING"; 
      public static final String ALERTING = "ALERTING"; 
      public static final String ACTIVE = "ACTIVE"; 
      public static final String IDLE = "IDLE"; 
      public static final String DISCONNECTED = "DISCONNECTED"; 
     } 
      
     public ReadLog(Context ctx) { 
      this.ctx = ctx; 
     } 
      
     /** 
      *   Log  
      *        log 
      *          
      */ 
     @Override 
     public void run() { 
      Log.d(TAG, "        "); 
       
      String[] catchParams = {"logcat", "InCallScreen *:s"}; 
      String[] clearParams = {"logcat", "-c"}; 
       
      try { 
       Process process=Runtime.getRuntime().exec(catchParams); 
       InputStream is = process.getInputStream(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
        
       String line = null; 
       while ((line=reader.readLine())!=null) { 
        logCount++; 
        //     
       Log.v(TAG, line); 
         
        //    512     
        if (logCount>512) { 
         //     
         Runtime.getRuntime().exec(clearParams) 
          .destroy();//    ,     
         logCount = 0; 
         Log.v(TAG, "-----------    ---------------"); 
        }  
         
        /*---------------------------------    -----------------------*/ 
        //   
        if (line.contains(ReadLog.CallViewState.FORE_GROUND_CALL_STATE) 
          && line.contains(ReadLog.CallState.IDLE)) { 
         Log.d(TAG, ReadLog.CallState.IDLE); 
        } 
         
        //    ,      ,    ,        , 
        if (line.contains(ReadLog.CallViewState.FORE_GROUND_CALL_STATE) 
          && line.contains(ReadLog.CallState.DIALING)) { 
         //     
         Intent dialingIntent = new Intent(); 
         dialingIntent.setAction(OutgoingCallState.ForeGroundCallState.DIALING); 
         ctx.sendBroadcast(dialingIntent); 
          
         Log.d(TAG, ReadLog.CallState.DIALING); 
        } 
         
        //          
        if (line.contains(ReadLog.CallViewState.FORE_GROUND_CALL_STATE) 
          && line.contains(ReadLog.CallState.ALERTING)) { 
         //     
         Intent dialingIntent = new Intent(); 
         dialingIntent.setAction(OutgoingCallState.ForeGroundCallState.ALERTING); 
         ctx.sendBroadcast(dialingIntent); 
          
         Log.d(TAG, ReadLog.CallState.ALERTING); 
        } 
         
        //   ,     
        if (line.contains(ReadLog.CallViewState.FORE_GROUND_CALL_STATE) 
          && line.contains(ReadLog.CallState.ACTIVE)) { 
         //     
         Intent dialingIntent = new Intent(); 
         dialingIntent.setAction(OutgoingCallState.ForeGroundCallState.ACTIVE); 
         ctx.sendBroadcast(dialingIntent); 
          
         Log.d(TAG, ReadLog.CallState.ACTIVE); 
        } 
         
        //    ,    
        if (line.contains(ReadLog.CallViewState.FORE_GROUND_CALL_STATE) 
          && line.contains(ReadLog.CallState.DISCONNECTED)) { 
         //     
         Intent dialingIntent = new Intent(); 
         dialingIntent.setAction(OutgoingCallState.ForeGroundCallState.DISCONNECTED); 
         ctx.sendBroadcast(dialingIntent); 
          
         Log.d(TAG, ReadLog.CallState.DISCONNECTED); 
        } 
         
       } //END while 
        
      } catch (IOException e) { 
       e.printStackTrace(); 
      } //END try-catch 
     } //END run 
    } //END class ReadLog 
    방송 을 보 냈 으 면 수신 자가 있어 야 합 니 다.수신 자 를 다음 과 같이 정의 합 니 다.(녹음기 에 관 한 코드 는 먼저 무시 할 수 있 습 니 다)
    
    package com.sdvdxl.phonerecorder; 
     
    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.util.Log; 
     
    import com.sdvdxl.outgoingcall.OutgoingCallState; 
     
    public class OutgoingCallReciver extends BroadcastReceiver { 
     static final String TAG = "Recorder"; 
     private MyRecorder recorder; 
      
     public OutgoingCallReciver() { 
      recorder = new MyRecorder(); 
     } 
      
     public OutgoingCallReciver (MyRecorder recorder) { 
      this.recorder = recorder; 
     } 
      
     @Override 
     public void onReceive(Context ctx, Intent intent) { 
      String phoneState = intent.getAction(); 
       
      if (phoneState.equals(Intent.ACTION_NEW_OUTGOING_CALL)) { 
       String phoneNum = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);//     
       recorder.setPhoneNumber(phoneNum); 
       recorder.setIsCommingNumber(false); 
       Log.d(TAG, "       "); 
       Log.d(TAG, "       :" + phoneNum); 
      } 
       
      if (phoneState.equals(OutgoingCallState.ForeGroundCallState.DIALING)) { 
       Log.d(TAG, "    ..."); 
      } 
       
      if (phoneState.equals(OutgoingCallState.ForeGroundCallState.ALERTING)) { 
       Log.d(TAG, "    ..."); 
      } 
       
      if (phoneState.equals(OutgoingCallState.ForeGroundCallState.ACTIVE)) { 
       if (!recorder.isCommingNumber() && !recorder.isStarted()) { 
        Log.d(TAG, "           "); 
        recorder.start(); 
         
       } 
      } 
       
      if (phoneState.equals(OutgoingCallState.ForeGroundCallState.DISCONNECTED)) { 
       if (!recorder.isCommingNumber() && recorder.isStarted()) { 
        Log.d(TAG, "         "); 
        recorder.stop(); 
       } 
      } 
     } 
     
    } 
          그 중 에 이런 코드 가 있 습 니 다.
    
    String phoneState = intent.getAction();  
        
      if (phoneState.equals(Intent.ACTION_NEW_OUTGOING_CALL)) {  
       String phoneNum = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);//      
       recorder.setPhoneNumber(phoneNum);  
       recorder.setIsCommingNumber(false);  
       Log.d(TAG, "       ");  
       Log.d(TAG, "       :" + phoneNum);  
      } 
     이곳 은 수신 시스템 에서 보 내 는 방송 으로 탈 전 방송 을 수신 하 는 데 쓰 인 다.이렇게 해서 탈 전 상 태 를 얻 었 다.
           3.상기 주요 코드 가 있 으 면 전기 감청 기능 이 완 성 된 셈 이 라 고 할 수 있 습 니 다.다음은 service 를 만들어 감청 을 실행 합 니 다.
    
    package com.sdvdxl.service; 
     
    import android.app.Service; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.content.IntentFilter; 
    import android.os.IBinder; 
    import android.telephony.PhoneStateListener; 
    import android.telephony.TelephonyManager; 
    import android.util.Log; 
    import android.widget.Toast; 
     
    import com.sdvdxl.outgoingcall.OutgoingCallState; 
    import com.sdvdxl.phonerecorder.MyRecorder; 
    import com.sdvdxl.phonerecorder.OutgoingCallReciver; 
    import com.sdvdxl.phonerecorder.TelListener; 
     
    public class PhoneCallStateService extends Service { 
     private OutgoingCallState outgoingCallState; 
     private OutgoingCallReciver outgoingCallReciver; 
     private MyRecorder recorder; 
      
     @Override 
     public void onCreate() { 
      super.onCreate(); 
       
      //------     onStartCommand , 2.3.5       service         -------- 
      //      ,                       
      //    ,            
      Log.d("Recorder", "     ..."); 
      recorder = new MyRecorder(); 
      outgoingCallState = new OutgoingCallState(this); 
      outgoingCallReciver = new OutgoingCallReciver(recorder); 
      outgoingCallState.startListen(); 
      Toast.makeText(this, "     ", Toast.LENGTH_LONG).show(); 
       
      //   
      IntentFilter outgoingCallFilter = new IntentFilter(); 
      outgoingCallFilter.addAction(OutgoingCallState.ForeGroundCallState.IDLE); 
      outgoingCallFilter.addAction(OutgoingCallState.ForeGroundCallState.DIALING); 
      outgoingCallFilter.addAction(OutgoingCallState.ForeGroundCallState.ALERTING); 
      outgoingCallFilter.addAction(OutgoingCallState.ForeGroundCallState.ACTIVE); 
      outgoingCallFilter.addAction(OutgoingCallState.ForeGroundCallState.DISCONNECTED); 
       
      outgoingCallFilter.addAction("android.intent.action.PHONE_STATE"); 
      outgoingCallFilter.addAction("android.intent.action.NEW_OUTGOING_CALL"); 
       
      //      
      registerReceiver(outgoingCallReciver, outgoingCallFilter); 
       
      //   
      TelephonyManager telmgr = (TelephonyManager)getSystemService( 
        Context.TELEPHONY_SERVICE); 
      telmgr.listen(new TelListener(recorder), PhoneStateListener.LISTEN_CALL_STATE); 
       
       
     } 
      
     @Override 
     public IBinder onBind(Intent intent) { 
      // TODO Auto-generated method stub 
      return null; 
     } 
     
     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
      unregisterReceiver(outgoingCallReciver); 
      Toast.makeText( 
        this, "         ", Toast.LENGTH_LONG) 
        .show(); 
      Log.d("Recorder", "         "); 
     } 
     
     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
       
      return START_STICKY; 
     } 
     
    } 
    다음 서비스 등록:
    XML/HTML 코드
      
           지금까지 오 가 는 전기 상태의 감청 기능 은 완 성 된 셈 이다.나머지 녹음 기 는 다음 과 같다.
    
    package com.sdvdxl.phonerecorder; 
     
    import java.io.File; 
    import java.io.IOException; 
    import java.text.SimpleDateFormat; 
    import java.util.Date; 
     
    import android.media.MediaRecorder; 
    import android.os.Environment; 
    import android.util.Log; 
     
    public class MyRecorder { 
     private String phoneNumber; 
     private MediaRecorder mrecorder; 
     private boolean started = false; //          
     private boolean isCommingNumber = false;//      
     private String TAG = "Recorder"; 
      
      
     public MyRecorder(String phoneNumber) { 
      this.setPhoneNumber(phoneNumber); 
     } 
      
     public MyRecorder() { 
     } 
     
     public void start() { 
      started = true; 
      mrecorder = new MediaRecorder(); 
       
      File recordPath = new File( 
        Environment.getExternalStorageDirectory() 
        , "/My record");  
      if (!recordPath.exists()) { 
       recordPath.mkdirs(); 
       Log.d("recorder", "    "); 
      } 
       
      String callDir = "  "; 
      if (isCommingNumber) { 
       callDir = "  "; 
      } 
      String fileName = callDir + "-" + phoneNumber + "-"  
        + new SimpleDateFormat("yy-MM-dd_HH-mm-ss") 
         .format(new Date(System.currentTimeMillis())) + ".mp3";//   3gp 
      File recordName = new File(recordPath, fileName); 
       
      try { 
       recordName.createNewFile(); 
       Log.d("recorder", "    " + recordName.getName()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
       
      mrecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
      mrecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 
      mrecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
       
      mrecorder.setOutputFile(recordName.getAbsolutePath()); 
       
      try { 
       mrecorder.prepare(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      mrecorder.start(); 
      started = true; 
      Log.d(TAG , "    "); 
     } 
      
     public void stop() { 
      try { 
       if (mrecorder!=null) { 
        mrecorder.stop(); 
        mrecorder.release(); 
        mrecorder = null; 
       } 
       started = false; 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } 
       
       
      Log.d(TAG , "    "); 
     } 
      
     public void pause() { 
       
     } 
     
     public String getPhoneNumber() { 
      return phoneNumber; 
     } 
     
     public void setPhoneNumber(String phoneNumber) { 
      this.phoneNumber = phoneNumber; 
     } 
     
     public boolean isStarted() { 
      return started; 
     } 
     
     public void setStarted(boolean hasStarted) { 
      this.started = hasStarted; 
     } 
     
     public boolean isCommingNumber() { 
      return isCommingNumber; 
     } 
     
     public void setIsCommingNumber(boolean isCommingNumber) { 
      this.isCommingNumber = isCommingNumber; 
     } 
     
    } 
           여기까지 전화 통 화 를 통 해 자동 으로 녹음 하 는 모든 기능 이 완성 되 었 습 니 다.여러분 이 직접 작성 하고 실현 할 수 있 습 니 다.
           이상 은 안 드 로 이 드 전화 녹음 에 대한 개발 입 니 다.필요 한 친 구 를 도 울 수 있 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기