음성 통화 녹음을위한 앱을 만들고 있습니다. 내가 알기 론 전화가 오면 전화는 OFFHOOK로갑니다.CALL_STATE_OFFHOOK 대신 STATE_IDLE_RINGING
이것은 일어난 일입니다. 그러나 전화를 걸고있는 순간에 내 앱이 녹음 중입니다. 그 후, 내가 전화 할 때마다 전화가 링잉 상태가됩니다. 모든 상태에 대해 Log.i() 문을 두어 변경 될 때마다 전화 상태를 가져올 수 있습니다. 전화를 걸 때마다 전화가 링잉 상태가됩니다. 여기
코드입니다 : -public class CallRecorder extends Service{
private MediaRecorder rec;
private boolean recordStarted;
private File file;
//private TelephonyManager manager;
//private StateListener listener;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Bundle b = intent.getExtras();
file = Environment.getExternalStorageDirectory();
rec = new MediaRecorder();
rec.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
rec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
rec.setOutputFile(file.getAbsolutePath() + "/TESTRECORD.3gp");
rec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
TelephonyManager manager = (TelephonyManager) getApplicationContext().getSystemService(getApplicationContext().TELEPHONY_SERVICE);
manager.listen(new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if(TelephonyManager.CALL_STATE_OFFHOOK==state && rec == null)
{
try {
Log.i("OUTGOING CALL", "CALL_STATE_OFFHOOK");
rec.prepare();
//Thread.sleep(500);
rec.start();
recordStarted = true;
Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else if(TelephonyManager.CALL_STATE_IDLE==state)
{
Log.i("OUTGOING CALL", "CALL_STATE_IDLE");
if(rec!=null)
{
try{
rec.stop();
rec.reset();
rec.release();
recordStarted = false;
stopSelf();
}
catch (IllegalStateException e) {
//Log.e("CALL ERROR",e.getMessage());
}// ILLEGALSTATEEXCEPTION WHILE THE CALL ENDS AUTOMATICALLY
}
}
else
{
Log.i("OUTGOING CALL", "CALL_STATE_RINGING"); // 2nd time outgoing
}
}
}, PhoneStateListener.LISTEN_CALL_STATE); // LISTENER REGISTERATION
Toast.makeText(this, "Calling...", Toast.LENGTH_LONG).show();
return 0;
}
}
지금 내가 전화 했어 때마다,
"PHONE_STATE_RINGING"에 대한 로그의 수가 증가하고있다. 두 번째로 전화를 걸었을 때, 3 번 표시되었습니다.
세 번째로 전화를 걸었을 때 5 번 표시되었습니다.
네 번째로 전화를 걸면 7 회 표시됩니다.
다음은 logcat입니다.
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:45.621: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING
12-26 13:53:52.071: I/OUTGOING CALL(7614): CALL_STATE_RINGING
는 모든 시도 후, CALL_STATE_IDLE가 표시됩니다.
그리고 아래와 같은 몇 가지 임의 오류가
표시됩니다stop is called in an invalid state:4
사람이 어떻게 일어나고 왜 & 말해 줄래? 미리 감사드립니다.