Cześć,
mam problem pisząc aplikację do nagrywania dźwięku w tle.
Celem aplikacji będzie nagrywanie wychodzących rozmów telefonicznych.
Aplikacja posiada dwa pola tekstowe - nazwa nagrania i numer na który chcemy dzwonić - oraz przycisk Dzwoń. Aplikacja składa się z Activity i Service do nagrywania dźwięku. Najlepszym pomysłem jest rozpoczęcie nagrywania gdy użytkownik naciśnie zieloną słuchawkę i zakończyć automatycznie z końcem rozmowy.
Problem z którym nie potrafię sobie poradzić, zauważyłem testując działanie MediaRecorder.
Kiedy wystartuję Service będąc w mojej aplikacji dźwięk nagrywany jest normalnie.
Kiedy wyjdę z aplikacji (przyciskiem dom) Service nadal działa i normalnie nagrywa dźwięk.
Kiedy np. wejdę w menu albo telefon, service nadal działa, nagrywanie trwa dalej, ale nie słychać dźwięku (całkowita cisza). Dlaczego?
Identycznie dzieje się gdy wywołam Service wykorzystując PhoneStateListener. Nagrywanie trwa, ale od początku do końca słychać tylko ciszę.
Czy inne aplikacje blokują mi dostęp do mikrofonu? Czy ktoś zna sposób na rozwiązanie mojego problemu?
Z góry bardzo dziękuję.
Activity:
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.print("onCreate");
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
recNumberET = (EditText) findViewById(R.id.editText1);
phoneNumberET = (EditText) findViewById(R.id.editText2);
call = (Button) findViewById(R.id.button1);
call.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
recNumber = accidentNumberET.getText().toString();
telephony.listen(phoneListener,
PhoneStateListener.LISTEN_CALL_STATE);
startDialingIntent();
}
});
}
private void startDialingIntent() {
phoneNumber = phoneNumberET.getText().toString();
String intentStr = "tel:" + phoneNumber;
Intent intent = new Intent("android.intent.action.DIAL",
Uri.parse(intentStr));
startActivity(intent);
}
private final PhoneStateListener phoneListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
try {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING: {
break;
}
case TelephonyManager.CALL_STATE_OFFHOOK: {
startService(new Intent(CallRecorder.this,
RecordingService.class));
serviceStopped = false;
break;
}
case TelephonyManager.CALL_STATE_IDLE: {
if (serviceStopped == false) {
stopService(new Intent(CallRecorder.this,
RecordingService.class));
telephony.listen(phoneListener,
PhoneStateListener.LISTEN_NONE);
}
break;
}
default: {
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
};
Service:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
recorder = new MediaRecorder();
setAudioDirectory();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(audiofile.getAbsolutePath());
try {
recorder.prepare();
recorder.start();
recordStarted = true;
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
if (recordStarted) {
recorder.stop();
recordStarted = false;
}
super.onDestroy();
}
private void setAudioDirectory() {
File sampleDir = new File(Environment.getExternalStorageDirectory()
+ "/NewRec");
if (!sampleDir.exists()) {
sampleDir.mkdir();
}
try {
audiofile = File.createTempFile(CallRecorder.recNumber,
".3gp", sampleDir);
} catch (IOException e) {
e.printStackTrace();
return;
}
}