Android - Prise audio à jouer par le biais de l'écouteur
J'ai actuellement un code qui lit un enregistrement dans des dispositifs micro à l'aide de la AudioRecord classe, puis la lecture de revenir à l'aide de la classe AudioTrack.
Mon problème est que quand je joue il joue via le haut-parleur du téléphone.
Je veux jouer via le morceau d'oreille sur l'appareil.
Voici mon code:
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;
}
}
}
Comme vous pouvez le voir si le code que j'ai essayé d'utiliser le AudioManager classe et ses méthodes, y compris le obsolète setRouting méthode et rien ne fonctionne, la setSpeakerphoneOn méthode semble n'avoir aucun effet, ni la méthode de routage.
Quiconque a des idées sur la façon de l'obtenir pour jouer via l'écouteur au lieu de la spaker téléphone?
Vous devez vous connecter pour publier un commentaire.
Juste eu à travailler sur 2.2. J'ai encore besoin de l'In_Call de l'installation je n'aime pas vraiment mais je vais m'en occuper pour l'instant. J'ai été en mesure d'abandonner le routage d'appel de stuff, qui est obsolète maintenant. Je trouve que vous avez certainement besoin du
Modify_Audio_Settings
autorisation, pas d'erreur sans elle, mais il lasetSpeakerPhone
méthode ne fait rien. Voici la maquette du code que j'ai utilisé.m_amAudioManager.setMode(AudioManager.MODE_NORMAL);
Il y a eu quelques discussions relatives à cette dernière question:
Android - puis-je mute en cours de lecture audio applications?
Basé sur la
AudioManager
code source, il semble que vous devez être en "mode d'appel" avant lesetSpeakerphoneOn
méthode a aucun effet.Cependant, j'ai récemment vu une application qui peut basculer de façon transparente entre l'écouteur et le haut-parleur mains libres pendant que montre toujours le flot courant que les "médias" stream, donc je serais intéressé par un quelconque de nouvelles réponses.
Misleaded par des réponses ici pour beaucoup de temps. Je suis sous Android 2.2. "audioManager.setSpeakerphoneOn(false);" travaille.
audioManager.setSpeakerphoneOn(false);
. Et aussi, vous devez créer MediaPlayer pas avec la méthode statiqueMediaPlayer.create()
, mais vous devez le créer avecnew MediaPlayer()...
Veuillez utiliser ce code, qui fonctionne bien:
Il semble que je ai eu à travailler sur 1.6.
Donc j'ai dit que j'avais poster ici comment j'ai fait.
Pour le faire fonctionner en 1.6 I:
Utilisé le
AudioManager
classe pour définirsetSpeakerphoneOn(false)
, j'ai ensuite utilisé leVoice_Call_Stream
et ajouter la commande de volume duVoice_Call_Stream
.La
setSpeakerphoneOn(false)
méthode est utilisée dansonCreate()
de l'activité et il semble que cette route pour le casque, j'ai ensuite utilisé un bouton et utilisé lesetSpeakerphoneOn(true)
méthode et l'audio est routée vers le haut-parleur.La méthode apparaît seulement au travail, lorsqu'il est utilisé dans
onCreate()
pour moi et je n'ai pas testé beaucoup mais pour le moment il me permet de basculer entre le casque et le haut-parleur sur un 1.6 appareilSi l'écouteur est connecté au téléphone avec bluetooth (qui je suppose qu'il est), avez-vous essayé d'appeler
AudioManager.setBluetoothScoOn(true)
?J'ai été par le biais de l'Android de référence et c'est la seule chose que j'ai pu trouver que vous n'avez pas parlé d'essayer.