2012-08-09 9 views
11

Sto cercando di implementare l'applicazione VoIP utilizzando le classi AudioGroup e AudioStream del pacchetto android.net.rtp. Ma la mia applicazione non funziona correttamente. Dopo "Unisci" l'oggetto di classe "AudioGroup" con l'oggetto "AudioStream", invia correttamente i pacchetti udp. Ho controllato che usando l'analizzatore di pacchetti. Ma la voce non viene ascoltata dal telefono. Corro la mia applicazione in 2 telefoni e provo a comunicare la voce tra di loro.Come implementare l'applicazione VOIP utilizzando il pacchetto android.net.rtp

In seguito menziono il mio codice sorgente.

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();} 
} 

Ho impostato queste autorizzazioni nel file 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" /> 

Sto usando il telefono Samsung GALAXY S3 con Android 4.0 OS

+0

Come hai fatto a risolvere questo problema? Ho esattamente la stessa domanda –

risposta

4

ho usato lo stesso codice hai inviato, e ottenuto che funziona con lievi modifiche. Fondamentalmente ho trovato il problema è stato ottenere il numero di porta corretto.

Quando si crea il numero audioStream, il numero di porta sembra essere casuale. A Android developer ho trovato: Note that the local port is assigned automatically to conform with RFC 3550.

Ciò che ho fatto è stato avviare l'applicazione su un solo telefono e utilizzare audioStream.getLocalPort() per trovare il numero di porta. Quindi mi sono connesso a questa porta usando l'altra. Ciò ha portato a una comunicazione a due vie, anche se avevo solo il numero di porta corretto su un telefono.

Spero che questo aiuti.

+0

La ringrazio molto per la sua risposta. La tua risposta è grandiosa. Ma voglio impostare manualmente la porta locale RTP. Come modifico la classe "AudioStream" per impostare la porta locale RTP dal codice. Grazie in anticipo. – user1576358

+0

Scusa, ma non ne ho idea. Volevo farlo da solo, ma non ci sono riuscito. Sembra che non sia possibile - che debba essere generato casualmente all'avvio. Tuttavia, se si utilizza ad esempio SIP, è possibile inviare il numero di porta e altre informazioni (ad esempio Audiocodec) prima dell'associazione. –

+0

Sono riuscito a far passare i dispositivi tra di loro utilizzando questo e il mio protocollo di segnalazione, per scambiare i parametri del flusso tra i client (numeri di porta e codec, ecc.) – tristan2468

1

Penso che dovresti impostare l'altoparlante!

forse è possibile utilizzare il seguente metodo:

audioManager.setSpeakerphoneOn(true); 
Problemi correlati