2012-08-09 16 views
11

Estoy intentando implementar la aplicación VoIP usando las clases AudioGroup y AudioStream del paquete android.net.rtp. Pero mi aplicación no funciona correctamente. Después de "Unir" el objeto de la clase "AudioGroup" con el objeto "AudioStream", envía paquetes udp con éxito. Lo revisé usando el analizador de paquetes. Pero la voz no se escucha desde el teléfono. Ejecuto mi aplicación en 2 teléfonos y trato de comunicar la voz entre ellos.Cómo implementar la aplicación VOIP usando el paquete android.net.rtp

A continuación menciono mi código fuente.

public class MainActivity extends Activity { 
private AudioStream audioStream; 
private AudioGroup audioGroup; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 

try { 
    audioGroup = new AudioGroup(); 
    audioGroup.setMode(AudioGroup.MODE_NORMAL);   
    audioStream = new AudioStream(InetAddress.getByAddress(new byte[] {(byte)192, (byte)168, (byte)1, (byte)4 })); 
    audioStream.setCodec(AudioCodec.PCMU); 
    audioStream.setMode(RtpStream.MODE_NORMAL); 
    audioStream.associate(InetAddress.getByAddress(new byte[] {(byte)192, (byte)168, (byte)1, (byte)2 }), 5004); 
    audioStream.join(audioGroup); 
    AudioManager Audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
    Audio.setMode(AudioManager.MODE_IN_COMMUNICATION); 
} 
catch (SocketException e) { e.printStackTrace();} 
catch (UnknownHostException e) { e.printStackTrace();} 
catch (Exception ex) { ex.printStackTrace();} 
} 

I establece esta permisos en el manifest.

<uses-permission android:name="android.permission.USE_SIP" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-feature android:name="android.hardware.sip.voip" android:required="true" /> 
<uses-feature android:name="android.hardware.wifi" android:required="true" /> 
<uses-feature android:name="android.hardware.microphone" android:required="true" /> 

estoy usando el teléfono Samsung Galaxy S3 con Android 4.0 OS

+0

¿Cómo se soluciona esto? Tengo exactamente la misma pregunta –

Respuesta

4

que utiliza el mismo código que envió, y lo consiguió trabajando con pequeños cambios. Básicamente encontré que el problema era obtener el número de puerto correcto.

Al crear el audioStream, el número de puerto parece ser aleatorio. En Android developer Encontré: Note that the local port is assigned automatically to conform with RFC 3550.

Lo que hice fue iniciar la aplicación en un teléfono primero y usé audioStream.getLocalPort() para encontrar el número de puerto. Luego me conecté a este puerto usando el otro. Esto dio como resultado una comunicación bidireccional, incluso si solo tenía el número de puerto correcto en un teléfono.

Espero que esto ayude.

+0

Muchas gracias por su respuesta. Tu respuesta es genial. Pero quiero configurar el puerto local RTP no manualmente. Cómo modifico la clase "AudioStream" para configurar el puerto local RTP desde el código. Gracias de antemano. – user1576358

+0

Lo siento, pero no tengo idea. Yo quería hacer esto yo mismo, pero no lo he logrado. Parece que no es posible, debe generarse aleatoriamente al inicio. Sin embargo, si utiliza, por ejemplo, SIP, puede enviar el número de puerto y otra información (por ejemplo, Audiocodec) antes de la asociación. –

+0

Logré hacer que los dispositivos se transmitieran automáticamente usando este y mi propio protocolo de señalización, para intercambiar los parámetros de la transmisión entre los clientes (números de puerto y códecs, etc.) – tristan2468

1

¡Creo que debería configurar el parlante!

Tal vez usted puede utilizar el siguiente método:

audioManager.setSpeakerphoneOn(true); 
Cuestiones relacionadas