안 드 로 이 드 는 휴대 전화 가 전 화 를 연결 한 후 진동 알림 기능 을 실현 한다.

어떤 휴대 전 화 는 전화 가 연 결 된 후에 진동 알림 이 있 는데,이것 은 연 결 된 후에 다시 귓가 에 넣 어 받 아 복 사 를 줄 일 수 있다 는 장점 이 있다.본 고 는 안 드 로 이 드 핸드폰 에서 이런 전 화 를 연결 한 후의 진동 알림 기능 을 어떻게 실현 하 는 지 에 대해 이야기 하고 자 한다.여 기 는 주로 전 화 를 거 는 것 을 대상 으로 한다.
       Android SDK 에서 제공 하 는 통화 상태
       전화 가 연 결 될 때 진동 알림 이 생기 려 면 먼저 전화 가 언제 연결 되 는 지 알 아야 한 다 는 것 이 분명 하 다.반면 안 드 로 이 드 SDK 는 이 상 태 를 직접 읽 는 방법 을 제시 하지 않 았 다.다음은 Android SDK 의 전화 서비스 류 Telephony Manager 가 제공 하 는 세 가지 전화 상태 입 니 다.
       CALL_STATE_IDLE         유 휴 상태
       CALL_STATE_오프라인 상태
       CALL_STATE_RINGING   벨 상태
       이 몇 가지 상 태 는 쉽게 이해 할 수 있다.상기 세 가지 상 태 를 통 해 우 리 는 단지 자동 사냥 과 전화 로 이 두 상 태 를 연결 할 수 있다.오늘 우리 가 실현 해 야 할 기능 은 할 수 없다.
       다른 방법 을 찾 아야 할 것 같 습 니 다.SDK 는 믿 을 수 없습니다.
       Android 실행 로그 분석
       다행히 안 드 로 이 드 가 실 행 될 때 대량의 로그 가 생 겨 서 우리 가 이 위 에서 돌 파 구 를 찾 을 수 있 는 지 볼 수 있 습 니 다.우 리 는 안 드 로 이 드 의 라디오 모듈 로 그 를 선택 하여 분석 합 니 다.우선 라디오 와 관련 된 로 그 를 읽 기 위해 코드 를 써 야 합 니 다.로 그 를 읽 으 려 면 로 그 캣 을 사용 해 야 합 니 다.

 Process process; 
  InputStream inputstream; 
  BufferedReader bufferedreader; 
  try { 
   process = Runtime.getRuntime().exec("logcat -v time -b radio"); 
   inputstream = process.getInputStream(); 
   InputStreamReader inputstreamreader = new InputStreamReader( 
     inputstream); 
   bufferedreader = new BufferedReader(inputstreamreader); 
 String str = ""; 
while ((str = bufferedreader.readLine()) != null) { 
  log.i("mLogcat",str); 
} 
} catch (Exception e) { 
    
  } 
또한 프로그램 이 시스템 로 그 를 읽 을 수 있 도록 권한 을 지정 해 야 합 니 다.AndroidManifest.xml 파일 에 내용 을 추가 하 십시오.
XML/HTML 코드
  
       위의 코드 를 통 해 우 리 는 라디오 의 log 를 출력 할 수 있다.그러면 우 리 는 DDMS 에서 이 log 를 보고 그 중의 통화 과정 을 분석 할 수 있다.구체 적 으로 잡 은 로 그 는 붙 이지 않 습 니 다.여러분 은 스스로 프로그램 을 작성 하여 위의 코드 를 통 해 캡 처 하고 분석 할 수 있 습 니 다.나 는 단지 나의 분석 결 과 를 말 할 뿐이다.
       로그 분석 을 통 해 약간의 실 마 리 를 발견 하 였 다.그 중 몇 개의 일 지 는 매우 유용 하 다.
       GET_CURRENT_CALLS  id=1,DIALING
       GET_CURRENT_CALLS  id=1,ALERTING
       GET_CURRENT_CALLS  id=1,ACTIVE
       log 가 비교적 길 기 때문에 나 는 모든 log 의 시작 부분 만 가 져 왔 기 때문에 진실 은 많은 내용 을 가 져 올 것 이다.우리 가 전 화 를 걸 때,이렇게 몇 개의 로 그 를 입력 할 것 이다.
       다이얼->알림->이벤트
       대체로 이런 과정 이다.몇 번 의 테스트 를 통 해 전화 가 연결 되 었 을 때 활동 상태 에 들 어가 출력:GETCURRENT_CALLS  id=1,ACTIVE  이 log,이로써 우 리 는 이미 성공 에 가 까 워 졌 다.
       그러나 그 후에 나 는 전화 가 연결 되 기 시작 하 는 동안 여러 차례 의'전화 걸 기->알림->활동'과 같은 상태 변 화 를 거 친 다 는 것 을 알 게 되 었 다.마이크 에서 삐 소리 가 나 면 GETCURRENT_CALLS 라 는 로 그 는 ALERTING 에 잠 겨 있 습 니 다.전화 가 연결 되 기 전에 GET 가 나타 나 지 않 습 니 다.CURRENT_CALLS 일지 입 니 다.
       위의 이 표현 은 잘 모 르 시 겠 지만,다시 말 하면 통화 가 연결 되 기 전에 여러 차례 GET 가 나타 날 수 있 습 니 다.CURRENT_CALLS ACTIVE 와 같은 로 그 는 전화 연결 이 한 번 밖 에 되 지 않 았 다.이것 은 우리 에 게 문 제 를 일 으 켰 다.단순히 GET 만 잡 을 수 는 없어 요.CURRENT_CALLS ACTIVE 라 는 메시지 로 판 단 했 습 니 다.
       우 리 는 단지 논리 적 인 판단 을 통 해 실현 할 수 있 을 뿐이다.
       인 스 턴 스 코드 설명
       다음은 제 코드 를 보 겠 습 니 다.

class TestThread implements Runnable { 
 //    
 Vibrator mVibrator; 
 //     
 TelephonyManager telManager; 
 public TestThread(Vibrator mVibrator, TelephonyManager telManager) { 
  this.mVibrator = mVibrator; 
  this.telManager = telManager; 
 } 
 @Override 
 public void run() { 
  //         
  int callState = telManager.getCallState(); 
  Log.i("TestService", "  .........." + Thread.currentThread().getName()); 
  //         
  long threadStart = System.currentTimeMillis(); 
  Process process; 
  InputStream inputstream; 
  BufferedReader bufferedreader; 
  try { 
   process = Runtime.getRuntime().exec("logcat -v time -b radio"); 
   inputstream = process.getInputStream(); 
   InputStreamReader inputstreamreader = new InputStreamReader( 
     inputstream); 
   bufferedreader = new BufferedReader(inputstreamreader); 
   String str = ""; 
   long dialingStart = 0; 
   boolean enableVibrator = false; 
   boolean isAlert = false; 
   while ((str = bufferedreader.readLine()) != null) { 
    //             ,     
    if (callState == TelephonyManager.CALL_STATE_OFFHOOK 
      && telManager.getCallState() == TelephonyManager.CALL_STATE_IDLE) { 
     break; 
    } 
    //     5       
    if (System.currentTimeMillis() - threadStart > 300000) { 
     break; 
    } 
    Log.i("TestService", Thread.currentThread().getName() + ":" 
      + str); 
    //   GSM  DIALING 
    if (str.contains("GET_CURRENT_CALLS") 
      && str.contains("DIALING")) { 
     //  DIALING        ALERTING    DIALING 
     if (!isAlert || dialingStart == 0) { 
      //  DIALING       
      dialingStart = System.currentTimeMillis(); 
      isAlert = false; 
     } 
     continue; 
    } 
    if (str.contains("GET_CURRENT_CALLS") 
      && str.contains("ALERTING")&&!enableVibrator) { 
      
     long temp = System.currentTimeMillis() - dialingStart; 
     isAlert = true; 
     //     ,    DIALING     ,    ALERTING     1.5      20      
     //       ACTIVE       . 
     if (temp > 1500 && temp < 20000) { 
      enableVibrator = true; 
      Log.i("TestService", "    ....." + temp + "....." 
        + Thread.currentThread().getName()); 
     } 
     continue; 
    } 
    if (str.contains("GET_CURRENT_CALLS") && str.contains("ACTIVE") 
      && enableVibrator) { 
     mVibrator.vibrate(100); 
     enableVibrator = false; 
     break; 
    } 
   } 
   Log.i("TestService", "  .........." 
     + Thread.currentThread().getName()); 
  } catch (Exception e) { 
   // TODO: handle exception 
  } 
 } 
} 
      나의 이 방법 은 비교적 억 지 스 러 웠 다.첫 번 째 DIALING 과 매번 ALERTING 사이 의 간격 을 판단 한 것 이다.만약 에 간격 이 1.5 초 이상 이 라면'뚜'소리 알림 에 들 어 갔다 고 생각 할 때 이다.그러면 다음 ACTIVE 는 전화 연결 이 될 것 이다.이 1.5 초 는 분석 로 그 를 통 해 나 온 것 이다.하지만 이런 방법 은 믿 을 수 없다 고 생각 합 니 다.여러분 이 좋 은 방법 이 있다 면 교류 할 수 있 습 니 다.
       나머지 는 이 스 레 드 가 전 화 를 걸 때 촉발 되 고 전화 에 상주 할 때 준비 하면 된다.Service 와 Receiver 를 결합 하여 실현 할 수 있 습 니 다.Service 는 상주,Receiver 는 감청 전 화 를 실현 합 니 다.기본적으로 우리 가 원 하 는 기능 을 완성 할 수 있다.
        이상 의 코드 는 내 가 모두 테스트 한 적 이 있 는데 99%가 유효 하 다.하하.이 안 드 로 이 드 의 기본 내용 인 logcat,Service,Receiver 등 이 언급 되 어 있 습 니 다.모 르 시 면 관련 글 자 료 를 찾 아 배 울 수 있 습 니 다.
        이 글 을 통 해 안 드 로 이 드 개발 에 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기