Attualmente ho un codice che legge una registrazione dal microfono del dispositivo utilizzando la classe AudioRecord e quindi riproducilo utilizzando la classe AudioTrack.Android - Riprodurre l'audio tramite l'auricolare
Il mio problema è che quando lo suono viene riprodotto tramite il vivavoce.
Voglio che venga riprodotto tramite l'auricolare sul dispositivo.
Ecco il mio codice:
public class LoopProg extends Activity {
boolean isRecording; //currently not used
AudioManager am;
int count = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setMicrophoneMute(true);
while(count <= 1000000){
Record record = new Record();
record.run();
count ++;
Log.d("COUNT", "Count is : " + count);
}
}
public class Record extends Thread{
static final int bufferSize = 200000;
final short[] buffer = new short[bufferSize];
short[] readBuffer = new short[bufferSize];
public void run() {
isRecording = true;
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int buffersize = AudioRecord.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
AudioRecord arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize);
AudioTrack atrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize, AudioTrack.MODE_STREAM);
am.setRouting(AudioManager.MODE_NORMAL,1, AudioManager.STREAM_MUSIC);
int ok = am.getRouting(AudioManager.ROUTE_EARPIECE);
Log.d("ROUTING", "getRouting = " + ok);
setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
//am.setSpeakerphoneOn(true);
Log.d("SPEAKERPHONE", "Is speakerphone on? : " + am.isSpeakerphoneOn());
am.setSpeakerphoneOn(false);
Log.d("SPEAKERPHONE", "Is speakerphone on? : " + am.isSpeakerphoneOn());
atrack.setPlaybackRate(11025);
byte[] buffer = new byte[buffersize];
arec.startRecording();
atrack.play();
while(isRecording) {
arec.read(buffer, 0, buffersize);
atrack.write(buffer, 0, buffer.length);
}
arec.stop();
atrack.stop();
isRecording = false;
}
}
}
Come si può vedere se il codice che ho provato ad utilizzare la classe AudioManager ei suoi metodi tra cui il metodo setRouting deprecato e non funziona nulla, il metodo setSpeakerphoneOn sembra avere alcun effetto del tutto, nemmeno il metodo di routing.
Qualcuno ha qualche idea su come farlo funzionare tramite l'auricolare invece del telefono Spaker?
Hai bisogno di riportare l'audio allo stato originale prima di impostarlo su IN_CALL? qualcosa del genere: int currAudioMode = audioManager.getMode(); \t \t \t \t \t \t audioManager.setMode (AudioManager.MODE_IN_CALL); \t \t \t audioManager.setSpeakerphoneOn (actionData.speakerOn); \t \t \t \t \t \t audioManager.setMode (currAudioMode); – Muzikant
L'ho impostato su MODE_NORMAL per riaccendere il vivavoce. Pertanto, il codice sopra riportato spegne l'altoparlante e si dirige verso l'auricolare, e il percorso del codice sottostante torna al valore predefinito dell'altoparlante. 'm_amAudioManager.setMode (AudioManager.MODE_NORMAL);' – Piwaf
disturba le impostazioni globali del telefono ?? –