안 드 로 이 드 는 휴대 전화 가 전 화 를 연결 한 후 진동 알림 기능 을 실현 한다.
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 등 이 언급 되 어 있 습 니 다.모 르 시 면 관련 글 자 료 를 찾 아 배 울 수 있 습 니 다.
이 글 을 통 해 안 드 로 이 드 개발 에 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.