エミュレータの代わりにデバイスを使用してUDP経由でポート5060にSIPパケットを送信すると、Androidで問題が発生します。例外は次のとおりです。
java.net.SocketException: sendto failed: EPERM(Opereation not permitted)
Galaxy Nexusなどの一部のデバイスでは、同じコードがAsusTransformerTF101やGalaxyTab2などの他のデバイスで動作します。これらの問題が発生しています。必要な許可がありandroid.permission.INTERNET
ます。同じSIPパケットを別のポート(たとえば9876)に送信すると、パケットは正常に送信されます。ポート5060(SIPパケットではない)を介して他のコンテンツを送信する場合でも、パケットは正常に送信されます。一部のデバイスでは、ポート5060を介したSIPパケットの組み合わせが許可されていないようです。この問題を再現するためのテストプログラムを作成しました。
try
{
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("10.111.110.6");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = "Register sip ...";
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, IPAddress, 5060);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
clientSocket.receive(receivePacket);
int x = receivePacket.getLength();
String modifiedSentence = new String(receivePacket.getData(), 0, x);
ds_tv.setText("FROM SERVER:" + modifiedSentence + " Length: "+ x);
clientSocket.close();
}
catch (Exception e)
{
Log.e("Test", e.getMessage());
ds_tv.setText(e.getMessage());
}
このテストプログラムはボタン1つだけで構成されており、上記のコードはonClick()イベントで呼び出されます。SIP登録パケットを含むで構成されるString sentence
パケットはポート5060を介して送信されません。ポートを変更すると、文字列文の内容を変更しても、パケットは正常に送信されます。ただし、ポート5060を介してSIP登録パケットを送信するとSocketException
発生します。何が問題なのか、どうすればそのような問題を解決できるのかわかりません。