안 드 로 이 드 는 전화 오 가 는 자동 녹음 기능 을 실현 한다.
전화 가 오 가 는 자동 녹음 의 관건 은 핸드폰 전화 상태의 변 화 를 어떻게 감청 하 느 냐 에 있다.
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
위의 로그 에서 볼 수 있 듯 이 모든 줄 의 끝 에 있 는 대문자 영문 단 어 는 바로 전 기 를 제거 한 상태 이 고 상 태 는 다음 과 같다.이 몇 개의 탈 전 상태 가 있 으 면 쉽게 할 수 있 습 니 다.지금 우리 가 해 야 할 일 은 시스템 로 그 를 읽 고 이 상 태 를 찾 는 것 입 니 다.추출 키 워드 는 바로 위 에서 언급 한 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;
}
}
여기까지 전화 통 화 를 통 해 자동 으로 녹음 하 는 모든 기능 이 완성 되 었 습 니 다.여러분 이 직접 작성 하고 실현 할 수 있 습 니 다.이상 은 안 드 로 이 드 전화 녹음 에 대한 개발 입 니 다.필요 한 친 구 를 도 울 수 있 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.