2012-08-09 11 views
11

Próbuję zaimplementować aplikację VoIP przy użyciu klas AudioGroup i AudioStream pakietu android.net.rtp. Ale moja aplikacja nie działa poprawnie. Po "Połącz" obiekt klasy "AudioGroup" z obiektem "AudioStream", pomyślnie wysyła pakiety udp. Sprawdziłem to za pomocą analizatora pakietów. Ale głos nie słychać z telefonu. Uruchamiam moją aplikację w 2 telefonach i próbuję komunikować głos między nimi.W jaki sposób zaimplementować aplikację VOIP przy użyciu pakietu android.net.rtp

Poniżej wymienię mój kod źródłowy.

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

Ustawiam te uprawnienia w pliku manifestu.

<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" /> 

używam telefonu Samsung GALAXY S3 z Android 4.0 OS

+0

Jak rozwiązać ten problem? Mam dokładnie to samo pytanie –

Odpowiedz

4

użyłem tego samego kodu przesłanego i got it pracy z niewielkimi zmianami. Zasadniczo znalazłem problem z poprawnością numeru portu.

Numer portu wydaje się być losowy podczas tworzenia numeru audioStream. Na Android developer znalazłem: Note that the local port is assigned automatically to conform with RFC 3550.

Co zrobiłem, najpierw uruchomiłem aplikację na jednym telefonie i użyłem numeru audioStream.getLocalPort(), aby znaleźć numer portu. Potem połączyłem się z tym portem za pomocą drugiego. Doprowadziło to do dwukierunkowej komunikacji, nawet jeśli miałem tylko prawidłowy numer portu na jednym telefonie.

Mam nadzieję, że to pomoże.

+0

Dziękuję bardzo za odpowiedź. Twoja odpowiedź jest świetna. Ale chcę ustawić port lokalny RTP nie ręcznie. Jak zmodyfikować klasę "AudioStream", aby ustawić port lokalny RTP z kodu. Dzięki zaawansowanym. – user1576358

+0

Przepraszam, ale nie mam pojęcia. Chciałem to zrobić sam, ale mi się nie udało. Wydaje się, że nie jest to możliwe - musi być generowane losowo przy starcie. Jednakże, jeśli używasz na przykład SIP, możesz wysłać numer portu i inne informacje (np. Audiocodec) przed powiązaniem. –

+0

Udało mi się przekonać urządzenia do strumieniowania między sobą za pomocą tego oraz mojego własnego protokołu sygnalizacji, aby wymienić parametry strumienia między klientami (numery portów i kodeki itp.). – tristan2468

1

Myślę, że powinieneś włączyć głośnik!

Być może można użyć następującej metody:

audioManager.setSpeakerphoneOn(true);