2012-08-09 83 views
11

android.net.rtpパッケージのAudioGroupクラスとAudioStreamクラスを使用してVoIPアプリケーションを実装しようとしています。しかし、私のアプリケーションは正しく機能しません。 "AudioGroup"クラスオブジェクトを "AudioStream"オブジェクトと "Join"した後、そのudpパケットを正常に送信します。パケットアナライザを使って確認しました。しかし、声は電話から聞こえません。私は2つの電話機でアプリケーションを実行し、それらの間で音声通信を試みます。android.net.rtpパッケージを使用してVOIPアプリケーションを実装する方法

私のソースコードについて以下に説明します。

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

この許可は、マニフェストファイルで設定します。

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

私は私はあなたが提出した同じコードを使用し、それは小さな変更で作業してしまったアンドロイド4.0 OS

+0

を実装し、このサンプルアプリケーションアウト

チェックはどのようにこの問題を解決しましたか?私はまったく同じ質問があります –

答えて

4

とサムスンのGALAXY S3の携帯電話を使用しています。基本的に私は問題がポート番号を正しく取得していたことがわかりました。

audioStreamを作成する場合、ポート番号はランダムなようです。 Android developerで見つけたのは:Note that the local port is assigned automatically to conform with RFC 3550.

私がしたことは、最初に1つの電話でアプリケーションを開始し、audioStream.getLocalPort()を使用してポート番号を検索したことです。次に、私はこのポートにもう一方を使って接続しました。これは、たとえ私が1つの電話機で正しいポート番号しか持っていなかったとしても、双方向通信になりました。

これが役に立ちます。

+0

ありがとうございました。あなたの答えは素晴らしいです。しかし、私は手動でRTPローカルポートを設定する必要があります。 "AudioStream"クラスを変更して、コードからRTPローカルポートを設定する方法。 ありがとうございました。 – user1576358

+0

申し訳ありませんが、私は考えていません。私はこれを自分自身でやりたいのですが、成功しませんでした。起動時に無作為に生成されなければならないことは不可能であるようです。ただし、たとえばSIPを使用する場合は、関連付ける前にポート番号やその他の情報(たとえばAudiocodecなど)を送信できます。 –

+0

クライアントとポート番号とコーデックなどの間でストリームのパラメータを交換するために、私自身のシグナリングプロトコルを使用して、デバイス間でストリームをやり取りするデバイスを手に入れることに成功しました – tristan2468

1

私はあなたがスピーカーをオンにする必要があると思います!トリックは、ポートマッピングが正しい取得することです

audioManager.setSpeakerphoneOn(true); 
関連する問題